首页 文章

为什么jvm在比较两个相同类型的对象时返回false? [重复]

提问于
浏览
-2

这个问题在这里已有答案:

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 回答

  • 0

    这里将在堆区域中创建 String s = new String("test"); 对象(不在String池化区域内),但是在任何操作之后返回的任何其他字符串将在String池化区域中创建 . 回答你的问题:

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

相关问题