我正在测试Strings,我提出了以下代码:
public static void main(String[] args){ StringBuilder sb1 = new StringBuilder("Cuba"); String str1 = sb1.toString(); // n1 System.out.println(str1 == str2); }
在n1
如果我把:
String str2 = sb1.toString();
我得到false
.但是,如果我放置:
String str2 = str1;
我得到true
.
我不确定为什么会发生这种情况:两个代码都指的是同一个实例,因此,两个输出必须是true
.
知道为什么两个输出都不同吗?我知道如何比较字符串,我只是对结果不同的原因感到好奇.
这是StringBuilder.toString()
OpenJDK 8u40 的代码:
@Override public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }
所以每次调用它时都会返回一个新的String.
设置时str2 = str1
,它们是相同的实例,因此==
返回true
.但是,当您设置时str2 = sb1.toString()
,它将设置为新的String(具有相同的内容),因此==
返回false
.
这实际上是在toString()
Javadoc中指定的(强调我的):
返回表示此序列中数据的字符串.分配并初始化一个新的String对象,以包含此对象当前表示的字符序列.然后返回此String.对此序列的后续更改不会影响String的内容.
请注意,您不应该使用==
比较String
s来开始(参考这个问题).