是什么使引用比较(==)对Java中的某些字符串有效?

我有以下几行代码来比较String。str1不等于str2,这是可以理解的,因为它比较对象引用。但是,为什么s1等于s2?

String s1 = "abc";

String s2 = "abc";

String str1 = new String("abc");

String str2 = new String("abc");

if (s1==s2)

System.out.println("s1==s2");

else

System.out.println("s1!=s2");

if (str1==str2)

System.out.println("str1==str2");

else

System.out.println("str1!=str2");

if (s1==str1)

System.out.println("str1==s1");

else

System.out.println("str1!=s1");

输出:

  s1==s2

str1!=str2

str1!=s1

回答:

字符串常量池实际上将缓存所有字符串文字,因此它们是下面的同一对象,这就是为什么你看到要执行输出的原因s1==s2。本质上,这是对VM的一种优化,可以避免每次声明文字时都创建新的字符串对象,这可能会很快变得非常昂贵!在你的str1==str2示例中,你明确地告诉VM创建新的字符串对象,因此为什么它是错误的。

顺便说一句,intern()在任何字符串上调用该方法都会将其添加到常量池中(并返回添加到该池中的String。)但这不一定是一个好主意,但是除非你确定要处理绝对将用作常量的字符串,否则你可能最终难以跟踪内存泄漏。

以上是 是什么使引用比较(==)对Java中的某些字符串有效? 的全部内容, 来源链接: utcz.com/qa/399361.html

回到顶部