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时,它不应该创建新实例。它应该共享相同的内存而不是创建新实例。那么,为什么在第二种情况下实例是不同的?
答案 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));