Сравнение объектов памяти по адресу, Java - PullRequest
0 голосов
/ 23 октября 2010
Robot r1,r2,r3;
r1=new Robot("Huey",2,3);
r2=new Robot("Louie",5,4);
r3=new Robot("Louie",5,4);
r1=r2;
r2=r3;
r3=r1;
System.out.print(r1==r2);

Итак, эта программа печатает false, но я думал, что она напечатает true.Он спрашивает, совпадает ли адрес памяти r1 с r2.Ну, r1 устанавливается равным r2, затем r2 меняется на r3, но это не должно иметь значения, верно?Это все еще r2, с которым мы сравниваем.

Ответы [ 6 ]

3 голосов
/ 23 октября 2010

Давайте посмотрим ситуацию после каждого назначения

// r1 - Huey, r2 - Louie1, r3 - Louie2
r1=r2;
// r1 - Louie1, r2 - Louie1, r3 - Louie2
r2=r3;
// r1 - Louie1, r2 - Louie2, r3 - Louie2
r3=r1;
// r1 - Louie1, r2 - Louie2, r3 - Louie1

В конце, r1 - это первый экземпляр 'Луи' (бывший r2), а r2 - второй.

PS Полагаю, мне не нужно комментировать, почему new Robot("Huey",2,3) == new Robot("Huey",2,3) возвращает false.

1 голос
/ 23 октября 2010

В r1=new Robot("Huey",2,3); диспетчер строковой памяти берет некоторую память из кучи (например, это память M1) и записывает туда Robot("Huey",2,3).А r1 ссылается на M1.

В r2=new Robot("Louie",5,4); менеджер строковой памяти берет некоторую память из кучи (например, это память M2) и записывает туда Robot("Louie",5,4).И r2 относится к M2.

И, наконец, в r3=new Robot("Louie",5,4); менеджер строковой памяти извлекает некоторую память из кучи (например, это память M3) и записывает туда Robot("Louie",5,4).И r3 относится к M3.

После r1=r2 команда r1 относится к M2.После r2=r3 команда r2 относится к M3.И после r3=r1 команда r2 ссылается на M2.

И когда вы пишете System.out.print(r1==r2), она пытается сравнить то, на что ссылаются r1 и r2, это означает M2 и M3.Вот почему он возвращает ложь.

1 голос
/ 23 октября 2010

Нет, переменные, указывающие на объекты, являются ссылками. Когда выполняется r1 = r2, r1 указывает на тот же объект, на который указывал r2, и после r2 = r3 тогда r2 указывает на тот же объект, на который указывал r3. Таким образом, вы сравниваете адрес памяти второго объекта Robot с адресом памяти третьего объекта Robot, и они отличаются. Если вы хотите получить семантическое равенство, ваш класс Robot должен переопределить equals () и hashCode (), взгляните на: http://www.technofundo.com/tech/java/equalhash.html

1 голос
/ 23 октября 2010

Вы можете визуализировать свой фрагмент как:

Initial        r1 -> Obj1, r2 -> Obj2, r3 -> Obj3

After r1=r2    r1 -> Obj2, r2 -> Obj2, r3 -> Obj3 ( Obj1 ready for GC)

After r2=r3    r1 -> Obj2, r2 -> Obj3, r3 -> Obj3

After r3=r1    r1 -> Obj2, r2 -> Obj3, r3 -> Obj2

Ясно, что в конце r1 и r2 не ссылаются на один и тот же объект, следовательно, сравнение их дает false.

1 голос
/ 23 октября 2010

Трассировка логики Через

r1 = Huey
r2 = Louie#1
r3 = Louie#2

r1 = Louie#1
r2 = Louie#2
r3 = Huey

делает r1 == r2?r1 - это Луи # 1, r2 - это Луи # 2

0 голосов
/ 23 октября 2010

Вы сравниваете два разных объекта робота.Используйте equals, которые должны быть переопределены в классе Robot.

...