为什么 jvm 在比较两个相同类型的对象时返回 false?
why is jvm returning false when comparing two objects of same type?
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) 为什么第三种情况 return 错误(已评论)。 s3 和 s 都指向 test 是吗?但似乎 JVM 在堆内存中为 s3 创建了另一个名为 test 的对象。但第二种情况(已评论)并不相同。它使用先前创建为 s 的对象(在代码中注释为 ***)。这是为什么?
2) s1 对象 TEST 会发生什么,因为 s3 是从 s1 创建的。 s1会被销毁还是在堆中?
此处String s = new String("test");
对象将在堆区(不在字符串池区内)创建,但任何操作后返回的任何其他字符串都将在字符串池区创建。回答你的问题:
s==s3
返回 false,因为它们是两个不同的对象。
s1
在被引用之前不会被垃圾收集器收集。
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) 为什么第三种情况 return 错误(已评论)。 s3 和 s 都指向 test 是吗?但似乎 JVM 在堆内存中为 s3 创建了另一个名为 test 的对象。但第二种情况(已评论)并不相同。它使用先前创建为 s 的对象(在代码中注释为 ***)。这是为什么?
2) s1 对象 TEST 会发生什么,因为 s3 是从 s1 创建的。 s1会被销毁还是在堆中?
此处String s = new String("test");
对象将在堆区(不在字符串池区内)创建,但任何操作后返回的任何其他字符串都将在字符串池区创建。回答你的问题:
s==s3
返回 false,因为它们是两个不同的对象。s1
在被引用之前不会被垃圾收集器收集。