【问题标题】:why is jvm returning false when comparing two objects of same type? [duplicate]为什么jvm在比较两个相同类型的对象时返回false? [复制]
【发布时间】:2019-05-10 08:19:25
【问题描述】:
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 会被销毁还是在堆中?

【问题讨论】:

  • 对于您问题的第 2 部分,s1 一直存在,直到它不再被引用。在您上面的示例中,它仍然被引用。如果您将 s1 设置为 null,它将有资格进行垃圾收集。
  • 谢谢杰森。请问第1题的答案可以吗
  • 看第一条评论的链接。
  • 不是我问题的答案。我问的是堆内存中创建的对象

标签: java object heap-memory equals-operator


【解决方案1】:

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

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

【讨论】:

  • 谢谢 Sukhpal Singh。清除了疑问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2012-09-27
  • 1970-01-01
  • 2020-02-11
  • 2014-12-13
相关资源
最近更新 更多