Java Строковые объекты равенства и ссылки - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующий код:

public class Test{

     public static void main(String []args){
        String x = "a";
        String y = "a";

        System.out.println(System.identityHashCode(x) == System.identityHashCode(y)); //true
        System.out.println(x.hashCode() == y.hashCode()); //true

        y = y+"b";

        System.out.println(x); // "a"
        System.out.println(y); // "ab"

        System.out.println(System.identityHashCode(x) == System.identityHashCode(y)); //false
        System.out.println(x.hashCode() == y.hashCode()); //false
     }
}

Сначала я создаю 2 строки x и y. Затем я проверяю их HashCodes и они одинаковы, поэтому это означает, что они являются одним объектом и указывают на одну ячейку памяти. Но когда я изменю значение y, значение x не изменится. Если я еще раз проверю их хэш-код, они будут разными, что означает 2 разных объекта и 2 разных места в памяти. Почему это происходит? Почему х не меняется, когда у меняется? (потому что мы просто меняем содержимое одной памяти)

Я использовал хеш-код в качестве этого вопроса.

Обновление: Моя путаница была для 2 причины:

a) Я думал, что одни и те же хеш-коды означают одни и те же объекты (Вы можете взглянуть на этот и этот вопросы для подробного объяснения, почему я не прав .)

b) Строки являются неизменяемыми, и если значение изменяется, создаются новые строки (как объяснено в ответах ниже.)

Ответы [ 2 ]

4 голосов
/ 03 апреля 2020

Строки в Java являются неизменяемыми. Вы не «меняете значение y», вы создаете новую строку и присваиваете ее y. Поскольку вы ничего не назначили x, он все равно будет ссылаться на предыдущую строку, которая у вас была.

2 голосов
/ 03 апреля 2020

Я думаю, что этот вопрос в конечном итоге связан с вашим неправильным пониманием того, что x и y являются объектами. x и y не являются объектами.

x и y являются переменными , а поскольку String является ссылочным типом, x и y хранят ссылки на объекты. Оператор присваивания = изменяет, какие ссылки хранят эти переменные.

В этих двух строках:

String x = "a";
String y = "a";

x и y хранят ссылки, ссылающиеся на один и тот же объект.

Но когда вы делаете y = y + "b", y + "b" создает новый объект . Затем = make y сохраняет ссылку на этот новый объект, поэтому y больше не указывает на тот же объект, что и x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...