gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:28 24 4
gpt4 key购买 nike

StringBuffer的SourceCode有一个变量toStringCache,但只有在toString()方法中它才获取值:

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

为什么不像StringBuilder那样使用toString:

return new String(value, 0, count); 

造成这种差异有什么特殊原因吗?

最佳答案

java中的字符串是不可变的,这意味着如果你只调用new String(char_array)它将创建数组的内部不可变副本。对原版的任何更改char_array不会反射(reflect)在新字符串中。然而,StringBuilder 使用包私有(private)构造函数 String(char[] value, boolean share)。它实际上允许它使用共享数组。但现在它必须确保这个共享数组没有被修改。因此它会创建一个副本并用它创建一个字符串。

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

关于java - 为什么 StringBuffer 的 toString() 方法使用 Arrays.copyOfRange(value, 0, count)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53572786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com