代码之家  ›  专栏  ›  技术社区  ›  HbnKing

为什么StringBuffer的toString()方法使用Arrays.copyOfRange(value,0,count)?

  •  1
  • HbnKing  · 技术社区  · 7 年前

    StringBuffer的源代码有一个变量 toStringCache ,但只限于 toString()

    public synchronized String toString() {
            if (toStringCache == null) {
                toStringCache = Arrays.copyOfRange(value, 0, count);
            }
            return new String(toStringCache, true);
        }
    

    toString 喜欢 StringBuilder :

    return new String(value, 0, count); 
    

    这种差异有什么特别的原因吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Denis Tulskiy    7 年前

    java中的字符串是不可变的,这意味着只要调用 new String(char_array) char_array

    new String(value) 也可以正常工作,但是每次调用StringBuilder.toString()都会创建数组的新副本。所以这是一个性能优化。

        2
  •  0
  •   aventurin    7 年前

    这个 toStringCache 数组与创建的字符串共享。这样可以避免每次复制数组内容 toString() 呼叫

    StringBuffer 是同步的,它可以确保 value StringBuilder

    以下示例可能会在以下情况下生成输出“aa” 字符串拼接 同样 toString() 字符串缓冲区 .

    StringBuilder s = new StringBuilder("ab");
    
    // Thread A, parallel with B
    System.out.println(s.toString());
    
    // Thread B, parallel with A
    s.reverse();