【问题标题】:Different output when calling toString on the same StringBuilder instance在同一个 StringBuilder 实例上调用 toString 时输出不同
【发布时间】:2016-03-10 19:04:59
【问题描述】:

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

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

知道为什么两个输出不同吗?我知道如何比较字符串,我只是好奇结果不同的原因。

【问题讨论】:

  • 我知道如何比较字符串。只是好奇他们不同的原因。
  • 对不起,我不是故意冒犯你的。
  • 我不这么认为 :)

标签: java string stringbuilder


【解决方案1】:

这是 OpenJDK 8u40 中StringBuilder.toString() 的代码:

@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(强调我的)中指定的:

返回表示此序列中数据的字符串。 分配了一个新的 String 对象并初始化为包含该对象当前表示的字符序列。然后返回此字符串。对该序列的后续更改不会影响字符串的内容。

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

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多