为什么 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"); 对象将在堆区(不在字符串池区内)创建,但任何操作后返回的任何其他字符串都将在字符串池区创建。回答你的问题:

  1. s==s3 返回 false,因为它们是两个不同的对象。
  2. s1 在被引用之前不会被垃圾收集器收集。