当trimToSize()方法不影响Java中StringBuffer类的capacity()方法返回的值时,会出现什么情况?
trimToSize()方法的规范中写道:当trimToSize()方法不影响Java中StringBuffer类的capacity()方法返回的值时,会出现什么情况?,java,string,stringbuilder,stringbuffer,capacity,Java,String,Stringbuilder,Stringbuffer,Capacity,trimToSize()方法的规范中写道: Calling this method may, but is not required to, affect the value returned by a subsequent call to the {@link #capacity()} method. trimToSize()方法不影响Java中StringBuffer类的capacity()方法返回的值的条件是什么 尝试减少用于字符序列的存储。如果缓冲区大于容纳其当前字符序列所需的大小,
Calling this method may, but is not required to,
affect the value returned by a subsequent call to the {@link #capacity()} method.
trimToSize()方法不影响Java中StringBuffer类的capacity()方法返回的值的条件是什么 尝试减少用于字符序列的存储。如果缓冲区大于容纳其当前字符序列所需的大小,则可以调整其大小,以提高空间效率 它不需要减少存储,也不可能减少存储(即使可以减少存储,也允许实现决定不减少存储会更有利)。如果存储空间减少,则后续调用
capacity()
返回的结果将改变
也就是说,我在AbstractStringBuilder
中看到的实现总是尽可能地减少存储空间(即,当不是所有的备份数组字符都被占用时):
public void trimToSize(){
如果(计数<值.长度){
value=Arrays.copyOf(值,计数);
}
}
这可能取决于实现。为什么这很重要?只是浏览一下JavaAPI的源代码。FWIW,当调用trimToSize
时,OpenJDK中的当前实现会将所有内容复制到最小大小的数组中。但这可能会在不同版本之间发生变化。@Thilo yep,我只是在你写评论时补充了这一点。感谢Java11源代码很有趣:似乎除了UTF-16的内部表示之外,他们现在还支持拉丁语-1。每个字符一个字节,而不是两个字节。(trimToSize
行为是相同的)。
public void trimToSize() {
if (count < value.length) {
value = Arrays.copyOf(value, count);
}
}