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