看到一个面试题说是String str1="abc"与String str2="abc"打印 str1==str2的结果,结果搞错了下面说明下这个问题,先看下代码
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);
System.out.println("====================分割线=====================================");
String str3 = new String("abc");
String str4 = new String("abc");
System.out.println(str3==str4);
测试结果如下
解释下原因,第一个true是因为,String是final的,他存储在方法区的常量区,看下图
显然“abc”在常量区只有一份,所以在多的引用,都是指向内存中同一个地址,所以结果是true
但如果是new 一个String对象呢,结果就会有所不同,此时在堆区会有一个对象被创建,如下图
从图中可以看出使用new 创建字符串时,会在堆区(heap)创建一个对象,它们都会引用常量区的一个字符串,所以,str3和str4不同。