首页 > 解决方案 > 为什么jvm在比较两个相同类型的对象时返回false?

问题描述

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 都指向测试是吗?但似乎 JVM在堆内存中为 s3创建了另一个名为test的对象。但对于第二种情况(评论)是不一样的。它使用之前创建为 s 的对象(在代码中注释为 ***)。这是为什么?

2) s1 对象TEST会发生什么,因为 s3 是从 s1 创建的。s1 会被销毁还是在堆中?

标签: javaobjectheap-memoryequals-operator

解决方案


此处String s = new String("test");对象将在堆区(不在字符串池区内)创建,但任何操作后返回的任何其他字符串都将在字符串池区创建。要回答您的问题:

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

推荐阅读