参考
-
String
1.String是final类;
2.对String的任何操作都不会改变原对象,任何操作都会生成新的对象;public class Main { public static void main(String[] args) { String str1 = "hello world"; String str2 = new String("hello world"); String str3 = "hello world"; String str4 = new String("hello world"); System.out.println(str1==str2); // false System.out.println(str1==str3); // true System.out.println(str2==str4); // false } }
3.JVM的内存机制中,有一个文件常池,用于存储编译期间生成的常量及符号引用;运行期间对应着方法区的运行时常量池;
如上代码运行结果:String str1 = "hello world"; String str2 = "hello world";
在编译时生成字面常量和符号引用,运行期间字面常量"hello world"被保存于运行时常量池。通过这种方式将String对象跟引用绑定的话,JVM执行引擎会先在运行时常量池查找是否存在相同的字面常量,如存在,则直接将引用指向已经存在的字面常量;否则开辟新空间存储,并将引用指向该字面常量。
new关键字生成的新对象是在堆区进行的,堆区生成的对象是不检测对象是否存在的。
4.反编译:javap -c 类
5.StringBuilder是在原字符串基础上进行修改符值;
6.事实上,StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized
,不用多说,这个关键字是在多线程访问时起到安全保护作用的,也就是说StringBuffer是线程安全的。