为什么如果我们使用“=”初始化 s1 和 s2而使用 String 构造函数初始化 s3 和 s4 ,两个具有相同内容的字符串的比较(s1==s2)
返回true但返回 false?#JAVA 喜欢(s3==s4)
String s1="s";
String s2="s";
String s3= new String("s");
String s4= new String("s");
为什么如果我们使用“=”初始化 s1 和 s2而使用 String 构造函数初始化 s3 和 s4 ,两个具有相同内容的字符串的比较(s1==s2)
返回true但返回 false?#JAVA 喜欢(s3==s4)
String s1="s";
String s2="s";
String s3= new String("s");
String s4= new String("s");
String s1
是参考而不是对象。这意味着当您比较时,s1 == s2
您是在比较参考资料,而不是这些参考资料所指向的内容。
当您有两个相同的字符串文字时,它们会被缓存并使用相同的对象。这样做是为了节省空间。这意味着具有相同内容的两个字符串文字指向同一个对象。
当您创建两个新对象时,它们具有不同的引用,因此它们不相等,即使s3.equals(s4)
为真。
我建议您查看String.intern()方法,该方法详细说明了字符串是如何汇集的。
所以这些都是真的。
s1 == s2;
s1 == s3.intern();
s3.intern() == s4.intern();
s1 == s1.intern();
s1 == s1.intern().intern().intern();
s3 != s3.intern();
事后看来,我认为 Java 应该有一个===
用于比较引用和==
比较内容的功能,即调用 equals,因为对于不了解 Java 中引用和对象之间区别的开发人员来说,这是一个常见的混淆来源。