String
-
JVM会先在常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。
String str1 = "hello world"; //"hello world"存储在常量池 String str2 = "hello world"; //str2与str1地址相同,都指向常量池中的"hello world" String str3 = new String("hello world"); //str3存储在堆上
-
String是final类型,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。
-
对String进行操作
过程:将str中的内容取出,与“world”相加并存入一个新new的String中,再将str指向新new的String。如果频繁进行相加的操作,资源开销大String str = "hello"; for(int i = 0; i < 100000; i++) str += "world"; //str += "world"; 等于 StringBuilder stringBuilder = new StringBuilder(str); stringBuilder.append("world");
StringBuilder & StringBuffer
- 由于对String进行操作都会生成新的String,开销大。因此,需要操作字符串时,一般使用StringBuilder或StringBuffer。使用StringBuilder,只需要new一次,之后再添加只需调用方法append()
- StringBuffer比较StringBuilder,具有线程安全性,但效率更低