看到一个面试题说是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不同。
本文通过两个示例详细解析了 Java 中 String 对象的内存分配原理。首先介绍了直接赋值的 String 对象如何共享同一内存地址,从而返回 true;接着探讨了通过 new 创建 String 对象时,即使内容相同也会位于不同的内存地址上,因此比较地址时返回 false。

46万+

被折叠的 条评论
为什么被折叠?



