比较两个相同类型的对象时,jvm为什么返回false?

时间:2018-12-09 01:26:30

标签: java object heap-memory equals-operator

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 :(得分:0)

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

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