1、String的特性
①String是一个final类,是不可变的字符序列(当对字符串进行操作时,需要重新定义一个区域的值,不能够对原来的区域内容进行修改)
②内部定义了final类型的char型数组,用于存储字符串数据
③String字面量的定义方式,声明的字符串值存放在字符串常量池中
④字符串常量池是不会存储相同内容的字符串
2、String实例化的方式
①通过字面量定义的方式:生成的变量指向字符串常量池中
②通过new+构造器的方式:生成的变量指向堆中
3、字符串生成结果位置
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello" + "world";
String s5 = s1 + "world";
String s6 = "hello" + s2;
String s7 = s1 + s2;
String s8 = s5.intern();
String s9 = (s1 + s2).intern();
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s7);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
System.out.println(s3 == s8);//true
System.out.println(s3 == s9);//true
如果声明等号右边是有变量名存在的,那么编译就会在堆中进行,结果也就生成在堆中;
如果声明等号右边单纯是字符串或字符串(常量)拼接,那么编译在常量池中及进行,结果就生成在常量池中;
如果声明等号右边变量使用了intern()方法,那么结果也生成在常量池中
如果变量是final修饰的,那么编译会在方法区中,是两个常量的拼接,那么结果也就在常量池中
一旦String类型变量调用了intern方法,那么就一定会返回在常量池的地址值
4、字符串常量池在JDK不同版本的位置
5、String的常用方法
int length()
:返回字符串的长度
char charAt(int index)
:返回字符串对应位置的char型字符 return value[index];
boolean isEmpty()
:判断字符串是否为空(长度是否为0) return length == 0;
String trim()
:返回去除原先字符串首末位置空格的字符串
boolean equals(Object obj)
:判断两个字符串内容是否相同
boolean equalsIgnoreCase(String anotherString)
:忽略大小写判断字符串内容是否相同
String concat(String str)
:等价于“+”的作用,拼接字符串
int compareTo(String anotherString)
:判断两个字符串大小(将每一个字符进行相减运算,求出总和)
String subString(int beginIndex)
:返回一个新的字符串,从beginIndex开始截取
String subString(int beginIndex, int endIndex)
:返回一个新字符串,从beginIndex开始,endIndex-1结束
boolean contains(CharSequence s)
:判断字符串中是否存在指定char值序列
int indexOf(String str)
:返回子字符串第一次在字符串中出现的索引位置
String replace(char oldChar, char newChar)
:返回一个替换了oldChar后的字符串
String replace(CharSequence target, CharSequence replacement)
:返回替换了原来字符串中所有非target字符串的新字符串
6、String的转化
String与字符数组(char[])的转化:
String转化为char[]:String调用toCharArray()方法
char[]转化为String:将char[]放入String创建对象的构造器中
String与字节数组(byte[])的转化:
String转化为byte[]:String调用getBytes()方法
byte[]转化为String:将byte[]放入String创建对象的构造器中
7、StringBuilder和StringBuffer
StringBuffer:可变的字符序列;线程安全,效率
StringBuilder:可变的字符序列;线程不安全,效率高;JDK5.0后新增的
StringBuffer/StringBuilder的创建:按给出的字符串的长度加上16的大小创建char[]数组
StringBuffer/StringBuilder的扩容:先判断原有的数组加上新添数组长度之和是否大于16,若大于,则扩容;默认情况下扩容为原来长度2倍+2,同时将,原有的数据复制到新的数组中
常用方法
append(String str)
:用于加入字符串/字符/数字进行拼接
delete(int start, int end)
:删除指定位置的字符/字符串(不包括end位置的)
replace(int start, int end, String str)
:替换指定位置的内容(不包括end位置的)
insert(int offset, String str)
:在指定位置插入内容
reverse()
:当前字符串逆转
int indexOf(String str)
:返回str首次在字符串中出现的位置
8、String、StringBuffer、StringBuilder效率
StringBuillder > StringBuffer > String
9、StringBuffer或StringBuilder使用append()方法,如果添加的字符串是null的话,输出的结果也会是"null"