为什么字符串在连接期间显示不同的行为?

时间:2015-04-06 04:52:18

标签: java

String a = "x";
String b = "x";
System.out.println(a==b);

它打印“ true ”,因为它在String常量池中共享相同的内存。但是当我写下面的代码时,

String a = "x";
String b = a + "y";
String c = "xy";
System.out.println(b==c);

打印错误

我知道'=='比较实例。

我的问题是 - 为什么实例在第二种情况下不相同。创建新String时,它始终检查池中是否有相同的字符串。然后在创建字符串b之后,即池中有“xy”。因此,当我尝试使用相同的“xy”创建String c时,它不应该创建新实例。它应该共享相同的内存而不是创建新实例。那么,为什么在第二种情况下实例是不同的?

3 个答案:

答案 0 :(得分:1)

此处,a + "y"创建一个新的String对象,因此==返回false。它检查对象引用而不是对象相等。

比较字符串时,应使用equals方法。

  • ==运算符检查两个引用变量是否引用同一对象
  • equals()方法检查对象的内容是否相同

了解difference between == operator and equals method in case of strings

答案 1 :(得分:1)

问题是String是immutable,对字符串的每个更新操作都会产生新的字符串,==检查实例,而不是类类型的情况下的值。

尝试final

final String b = a + "y";

或使用equals()

System.out.println(b.equals(c));

<强> 编辑:

字符串文字直接在字符串池中可用,在这种情况下String b = a + "y"不相同,这里它在堆中。您可以使用intern()使其在字符串池中可用。

String b = (a + "y").intern();
System.out.println(a==b);//true

答案 2 :(得分:-1)

这可能有用,可以找到解释原因here

String a = "x";
String b = a + "y";
String c = "xy";
System.out.println(b.equals(c));
相关问题