首先要分清堆内存和常量池的区别就明白了
//s1和s2有什么区别?
s1创建一个对象,s2创建两个对象
//s3不是创建了一个新的对象,为什么比较结果会是true?
因为s1和s3都指向常量池中的"abc",常量池中的数据已经有"abc",又常量池中的数据不可改,常量池中再创建一个就没意义了
并不是所有字符串都会放在常量池中,能放在常量池中的字符串,必须是以字符串常量的身份进入的。如:
String str = "abc";
此时,常量池中自然会有“abc”,而且是在编译阶段进行的。
而String s1 = new String("abc");
这里的“abc”和常量池并没有什么关系。因为此时的"abc",存在于堆中,并不是常量池里的那个。更不会是从常量池复制过来的。 |