Java StringBuffer не меняет ссылку после расширения - PullRequest
0 голосов
/ 02 марта 2019

Из документов StringBuffer :

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

Насколько я понимаю, это означает, что если мы используем метод append для строкового буфера и длина данной строки превышаетемкость строкового буфера, JVM автоматически выделит больший объем памяти для нового строкового буфера и сохранит старый строковый буфер вместе с заданной строкой.Однако в этом случае как старый строковый буфер, так и новый строковый буфер могут иметь одну и ту же ссылку, как указано ниже.Длина добавляемой строки превышает 16 байтов, поэтому это заставит JVM выделить новую память для буфера новой строки.

public class test {

    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("initial value");

        System.out.println("before: the reference is " + System.identityHashCode(sb));

        sb.append(" - this message is append through sb and this message is longer than 16 bytes");

        System.out.println("after: the reference is " + System.identityHashCode(sb));
    }
}

вывод

before: the reference is 511833308
after: the reference is 511833308

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Как уже было сказано, после добавления строки ссылка StringBuffer не меняется, это все тот же объект. Он просто выделяет больший массив для хранения символов.Также стоит упомянуть, что переопределение hashCode для возврата хеша значимых полей является хорошей практикой, потому что это поможет вам отслеживать мутацию вашего объекта, но поскольку StringBuffer не переопределяет его, и поскольку вы вызываете System.identityHashCode, он просто всегда возвращает хеш начального объекта, который не изменится, если вы не назначите другой экземпляр StringBuffer переменной sb.Последнее, что реализация по умолчанию hashCode не обязательно связана со ссылкой на объект, и вы не можете полагаться на это

0 голосов
/ 02 марта 2019

Есть слой косвенности, как это обычно бывает.Фактические символьные данные хранятся в объекте char[] (обычно).Тот же самый экземпляр StringBuffer (или StringBuilder) изменяет свою ссылку на char[] со старого объекта на новый.Нет new StringBuffer.

Исходный код Java java.lang.StringBuffer (и родительский класс) легко доступен, если вы хотите посмотреть на это.

...