一尘不染

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

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 

阅读 350

收藏
2020-03-22

共1个答案

一尘不染

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

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

2020-03-22