java - 在同一 StringBuilder 实例上调用 toString 时的不同输出

标签 java string stringbuilder

我正在围绕字符串进行测试,我想出了以下代码:

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);
}

所以每次调用它时它都会返回一个新的字符串。

当您设置 str2 = str1 时,它们是相同的实例,因此 == 返回 true。但是,当您设置 str2 = sb1.toString() 时,它会被设置为一个新的字符串(具有相同的内容),因此 == 返回 false.

这实际上是在toString()中指定的Javadoc(强调我的):

Returns a string representing the data in this sequence. A new String object is allocated and initialized to contain the character sequence currently represented by this object. This String is then returned. Subsequent changes to this sequence do not affect the contents of the String.

请注意,您不应该使用 == 来比较 String 开头(请参阅 this question)。

关于java - 在同一 StringBuilder 实例上调用 toString 时的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112214/

相关文章:

python - 如何更改 python 中 print 语句的输出格式?

java - StringBuilder 是否慢到我应该缓存它的结果?

java - 如何在 Java 中将字节数组转换为十六进制格式

java - RPN 表达式 java 中元素之间的空格

java - 致命信号 11 (Sigsegv) 位于 0x00000000(代码=1)?

java - 尽管场景中不存在该对象,为什么我仍能获得匹配项

java - 使用 GridBagConstraints 的奇怪布局

java - 实现动态奖励制度

c# - 将由返回字符分隔的字符串转换为 List<string> 的最佳方法是什么?

string - 在 Go 中执行 http 请求时字符串出现乱码