String类
1.类的声明:
public final class String
implement java.io.Serializable, Comparable, CharSequence
-final:String是不可被继承的。
-Serializable:可序列化的接口。凡是实现此接口的类的对象就可以通过网络或本地留进行数据的传输。
-Comparable:凡是实现此接口的类,其对象都可以比较大小。
2.内部声明声明的属性:
-
jdk8.0及以下:
-
private final char value[];//存储字符串数据的容器
-final:指明此value一旦确定其地址就不可改变
-
jdk8.0之后:private final byte value[];//存储字符串数据的容器
3.字符常量的存储位置:
-
位置:字符串常量池(StringTable)
-
细节:字符串常量池不允许存放两个相同的字符串常量池
-
字符串常量值在内存中的位置:(jdk6及之前在方法区,jdk7之后在堆空间中)
jdk6.0之前:

jdk7.0开始:

4.String的不可变性的理解:
- 当字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有位置修改
java
//String的不可变性
@Test
public void test2()
{
String s1 = "hello";
String s2 = "hello";
s2 = "hi";
System.out.println(s1);//hello
}
5.String的实例化的两种方式:
- String s1 = "hello";
- String s2 = new String("hello");
- 两种方式在内存中的存储不同:

6.String的连接:
- 常量 + 常量:结果仍然存储在字符串常量池中,返回此字面量的地址。注:此常量不止为字面量,还有final修饰的变量
- 常量 + 变量 或 变量 + 常量:都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址。
- 调用字符串的intern():返回的是字符串常量池中字面量的地址。
- concat:不管参数是常量还是变量,调用完concat()方法都返回了一个new的对象。
7.String构造器和常用方法:
-
构造器:
- public String()
- public String(String original):初始化一个新建的"String"对象,使其表示一个参数相同的字符序列。
- public String(char[] value):通过字符数组来构建新的String。
- public String(char[],int offset,int count):通过字符数组的一部分来构建新的String。
- public String(byte[] bytes):通过平台默认字符集解码当前字节数组来构造新的String。
- public String(byte[] bytes,String charsetName):通过指定字符集解码当前字节数组来构造新的String。
-
常用方法:
(1)boolean isEmpty():字符串是否为空
(2)int length():返回字符串的长度
(3)String concat(xx):拼接
(4)boolean equals(Object obj):比较字符串是否相等,区分大小写
(5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
(6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
(7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
(8)String toLowerCase():将字符串中大写字母转为小写
(9)String toUpperCase():将字符串中小写字母转为大写
(10)String trim():去掉字符串前后空白符
(11)public String intern():结果在常量池中共享
-
查找:
(11)boolean contains(xx):是否包含xx
(12)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1
(13)int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
(14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1
(15)int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
-
字符串截取:
(16)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
(17)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
-
和字符/字符数组相关:
(18)char charAt(index):返回[index]位置的字符
(19)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回
(20)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
(21)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
(22)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
(23)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String
-
开头与结尾:
(24)boolean startsWith(xx):测试此字符串是否以指定的前缀开始
(25)boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
(26)boolean endsWith(xx):测试此字符串是否以指定的后缀结束
-
替换:
(27)String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 不支持正则。
(28)String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
(29)String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
(30)String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
StringBuffer类与StringBuilder类
1.三种类的对比:String、StringBuffer和StringBuilder:
- String:不可变的字符序列。
- StringBuffer:可变的字符序列;jdk1.0声明,线程安全,效率低。
- StringBuilder:可变的字符序列;jdk5.0声明,线程不安全,效率高。
- 相同点:使用char[](jdk8.0及之前)或使用byte[](jdk9.0及之后)。
2.StringBuffer/StringBuilder的可变性分析:
-
String的不可变性:
- String s1 = new String(); //char[] value = new cahr[0];
- String s2 = new String("abc"); //char[] value = new char[]{'a','b','c'};
-
StringBuilder/StringBuffer的可变性(以StringBuilder为例):
-
内部属性为:
char[] value; //存储字符序列
int count; //实际存储的字符个数
-
StringBuilder sBuilder1 = new StringBuilder(); //char[] value = new char[16];
-
StringBuilder sBuilder2 = new StringBuilder("abc"); //char[] value = new char[16 + "abc.length()"];
-
sBuilder1.append("ac"); //value[0] = 'a';value[1] = 'c';
-
sBuilder2.append("b"); //value[2] = 'b';
-
-
理解:
- 不可变性可理解为String类的容器char[]数组长度是固定的,字符串存储在字符串常量池中。
- 而可变性可理解为StringBuffer/StringBuilder的容器char[]数组长度可以自动扩容,字符串存储在堆空间中。
3.StringBuffer和StringBuilder中的常用方法:
增:
- append(String str)
- 删:
- delete(int start, int end)
- deleteCharAt(int index)
- 改:
- replace(int start, int end , String str)
- setCharAt(int index, char c)
- 查:
- charAt(int index)
- 插:
- insert(int index , String str)
- 长度:
- length()
- 反转:
- reverse()
4.对比三种的执行效率:
- StringBuilder > StringBuffer > String