为什么在比较Java中的两个对象时却得到不同的字符串池输出?

时间:2018-08-07 04:17:54

标签: java string string-pool

我正在运行该程序。检查字符串池的概念。我引用了this link,并用java中Object类的equals方法添加了两行。为什么我得到objRef1 == objRef2与objRef1.equals(objeRef2)的不同输出。我认为它们应该相同。

public class Abc2 {
    public static void main(String[] args) {
        String s1 = "Cat";
        String s2 = "Cat";
        String s3 = new String("Cat");

        System.out.println("s1 == s2 :"+(s1==s2));
        System.out.println("s1.equals(s2) :"+(s1.equals(s2)));
        System.out.println("s1 == s3 :"+(s3==s2));
        System.out.println("s1.equals(s3) :"+(s3.equals(s2)));
    }
}

2 个答案:

答案 0 :(得分:2)

String s=new String("Cat");//creates two objects and one reference variable

在这种情况下,JVM将在普通(非池)堆内存中创建一个新的字符串对象,并且文字“ Cat”将放置在字符串常量池中。变量s将引用堆(非池)中的对象。

String s="Cat";  //String literal is created by using double quotes

在这种情况下,每次创建字符串文字时,JVM首先检查“字符串常量池”。如果该字符串已经存在于池中,则返回对该池实例的引用。如果该字符串在池中不存在,则会创建一个新的字符串实例并将其放置在池中。

更多详情通过difference between “text” and new String(“text”)?

2。)String immutable

答案 1 :(得分:0)

String是一个复杂的数据类型,因此==查找两个不同的引用。 字符串equals()比较内容而不是引用。 因此,两个“猫”具有相同的内容,但对象相同。 就像您尝试说C:\ test.txt和C:\ test2.txt在同一文件中一样,因为它们具有相同的内容。