public class Demo {
public static void main(String[] args) {
String str1="abc";
String str2="abc";
String str3=new String("abc");
String str4=new String("abc");
String str5=str4.intern();
System.out.println(str1==str2);//第一行,true
System.out.println(str1==str3);//第二行,false
System.out.println(str1==str5);//第三行,true
System.out.println(str3==str4);//第四行,false
System.out.println(str3==str5);//第五行,false
}
}
1.str1和str2在赋值时,使用的是字符串常量,java虚拟机中有一个常量池机制,它会直接把字符串常量放入常量池中,从而实现复用,所以它们都是指向的常量池中的同一个内存地址,所以返回true。
2.str3是用new创建的,在java中new关键字代表的是创建一个新的对象,因此str3指向的一个全新的内存地址,而str1指向的是常量池中的一个旧地址,所以返回false。
3.str5是String用intern()方法创建出来的,jdk文档中对intern()方法是这样描述的:“返回一个常量池中的固定对象,当intern方法被调用时,如果常量池中已经包含这个对象(用equals方法判断是否包含),那么直接返回这个对象。否则就向常量池中添加这个对象并返回它的引用”。
4.str3和str4分别用new方法创建的对象,所以地址肯定不同,返回false。
5.str3指向的新建的内存地址,str5指向的是常量池中存在的地址,所以地址不同,返回false。
=分割线===========================================================
+的操作产生的对象是在堆里新建了个对象 不是在常量池中找的 等价于用stringbuilder 所以b跟c d其实指向的地址不一样 b是指向堆中 c和d指向的是常量池中的"abcd",
语言可能描述的不准确,仅供参考