0

为什么如果我们使用“=”初始化 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");
4

1 回答 1

0

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 中引用和对象之间区别的开发人员来说,这是一个常见的混淆来源。

于 2013-11-10T17:20:17.270 回答