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会被销毁还是会在堆中?
答案 0 :(得分:0)
此处String s = new String("test");
对象将在堆区域(不在String池区域内)中创建,但是在执行任何操作后返回的任何其他字符串将在String池区域中创建。要回答您的问题:
s==s3
返回false,因为它们是两个不同的对象。 s1
在被引用之前不会被垃圾收集器收集。