这个问题在这里已有答案:
public class Test
{
public static void main(String[] args)
{
String s = new String("test");// ***
String s1 = s.toUpperCase();
String s2 = s.toLowerCase();
String s3 = s1.toLowerCase();
System.out.println(s==s1);//first case
System.out.println(s==s2);//second case
System.out.println(s==s3);//third case
}
}
1)为什么第三种情况(注释)返回false . s3和s都指向 test 是吗?但似乎JVM在堆内存中为s3创建了另一个名为 test 的对象 . 但对于第二种情况(评论)则不一样 . 它使用以前创建为s的对象(在代码中注释为***) . 这是为什么?
2)s1对象 TEST 会发生什么,因为s3是从s1创建的 . s1会被破坏还是会堆在堆里?
1 回答
这里将在堆区域中创建
String s = new String("test");
对象(不在String池化区域内),但是在任何操作之后返回的任何其他字符串将在String池化区域中创建 . 回答你的问题:s==s3
返回false,因为它们是两个不同的对象 .垃圾收集器在被引用之前不会收集
s1
.