当trimToSize()方法不影响Java中StringBuffer类的capacity()方法返回的值时,会出现什么情况?

当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()方法返回的值的条件是什么 尝试减少用于字符序列的存储。如果缓冲区大于容纳其当前字符序列所需的大小,

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()方法返回的值的条件是什么

尝试减少用于字符序列的存储。如果缓冲区大于容纳其当前字符序列所需的大小,则可以调整其大小,以提高空间效率

它不需要减少存储,也不可能减少存储(即使可以减少存储,也允许实现决定不减少存储会更有利)。如果存储空间减少,则后续调用
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);
    }
}