比较对象的内存地址,Java

时间:2010-10-23 17:08:48

标签: java object boolean

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);

所以这个程序打印错误,但我认为它会打印出来。它询问r1的存储器地址是否与r2相同。好吧r1设置为等于r2,然后r2变为r3,但这不重要,对吧?它仍然是r2我们正在比较它。

6 个答案:

答案 0 :(得分:3)

让我们看看每次作业后的情况

// 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是第一个'Louie'实例(以前为r2),r2是第二个。

PS我假设我不需要评论为什么new Robot("Huey",2,3) == new Robot("Huey",2,3)返回false。

答案 1 :(得分:1)

通过

跟踪逻辑
r1 = Huey
r2 = Louie#1
r3 = Louie#2

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

r1 == r2? r1是Louie#1,r2是Louie#2

答案 2 :(得分:1)

您可以将您的代码段可视化为:

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

显然,最后r1r2不会引用相同的对象,因此比较它们会false

答案 3 :(得分:1)

不,指向对象的变量是引用。当执行r1 = r2时,r1指向r2指向的相同对象,并且在r2 = r3之后,r2指向r3指向的相同对象。因此,您将第二个Robot对象的内存地址与第三个Robot对象的内存地址进行比较,它们是不同的。如果你想要语义相等,你的Robot类必须覆盖equals()和hashCode(),看看:http://www.technofundo.com/tech/java/equalhash.html

答案 4 :(得分:1)

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。这就是它返回false的原因。

答案 5 :(得分:0)

您要比较两个不同的Robot对象。使用必须在Robot类中重新定义的equals。