我正在运行该程序。检查字符串池的概念。我引用了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)));
}
}
答案 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首先检查“字符串常量池”。如果该字符串已经存在于池中,则返回对该池实例的引用。如果该字符串在池中不存在,则会创建一个新的字符串实例并将其放置在池中。
答案 1 :(得分:0)
String是一个复杂的数据类型,因此==查找两个不同的引用。 字符串equals()比较内容而不是引用。 因此,两个“猫”具有相同的内容,但对象相同。 就像您尝试说C:\ test.txt和C:\ test2.txt在同一文件中一样,因为它们具有相同的内容。