- String是不变对象,JVM对其做了一个优化,在内存中开辟了一段区域作为常量池,凡是通过“字面量”形式创建的字符串对象都会缓存并重用。因为会重用对象,所以该对象内容不可便。
String a1 = "abc,123";
String a2 = "abc,123";
System.out.println(a1==a2);//true
//修改内容会创建并引用对象
a1 = a1 + '!';
System.out.println(a1);
修改内容会在堆中创建新对象,并且引用
//new 出来的是新对象,所以不相等
String a3 = new String("abc,123");
System.out.println(a2==a3);//false
new 出来就是新对象,在堆中创建了另一个对象,两者是两个对象,所以是false;在字符串中==号判断相等不合适,所以一般是使用equal进行比较,这边是说明一下区别;
String a4 = "abc," + "123";//String a4 = "abc,123";
System.out.println(a4);
System.out.println(a4==a2);//true
编译器面试题可能会出现:
编译器有个优化措施,当编译源代码时发现一个计算表达式所有参数都是字面量时,会直接计算,
并将结果编译到class文件中,所以上面代码在class文件中为:
String a4 = “abc,123”;
String a5 = "abc,";
String a6 = a5 + "123";
System.out.println(a6);
System.out.println(a6==a2);//false
计算式一方为变量,会在运行期拼接,将创建一个新对象