В каких случаях метод trimToSize () не влияет на значение, возвращаемое методомacity () класса StringBuffer в Java? - PullRequest
0 голосов
/ 20 января 2019

В спецификации метода trimToSize () было написано, что:

Calling this method may, but is not required to, 
affect the value returned by a subsequent call to the {@link #capacity()} method.

Каковы условия, когда метод trimToSize () не влияет на значение, возвращаемое методомacity () класса StringBuffer в Java?

1 Ответ

0 голосов
/ 20 января 2019

Ну, начало trimToSize Javadoc говорит

Попытки для уменьшения памяти, используемой для последовательности символов. Если размер буфера больше необходимого для хранения текущей последовательности символов, его размер может быть изменен , чтобы сделать его более эффективным

Это не требует уменьшения хранилища, и, возможно, будет невозможно уменьшить хранилище (и даже если возможно уменьшить хранилище, реализация может решить, что было бы более выгодно не уменьшить хранилище). Если объем хранилища уменьшается, результат, возвращаемый при последующем вызове capacity(), изменится.

Тем не менее, реализация, которую я вижу в AbstractStringBuilder, всегда уменьшает объем памяти, когда это возможно (т. Е. Когда заняты не все символы резервного массива):

public void trimToSize() {
    if (count < value.length) {
        value = Arrays.copyOf(value, count);
    }
}
...