假设我有一个MyObject
类,它存储在两个不同的ArrayList
中。如果从2 ArrayList获取相同的对象,我将如何比较它们以检查它们是否相同?
我会instance1 == instance2
还是instance1.equals(instance2)
?我很确定==运算符会查看指针位置,但如果我从array1获取instance1而从array2获取instance2,它们会返回不同的指针位置还是相同的?
与Hashtable相同:它是否将指针位置存储为键或实际对象?如果我有2个具有相同内容但实际上是不同对象的对象,它仍然可以工作吗?
由于
答案 0 :(得分:1)
如果我从array1获取instance1而从array2获取instance2,它们会返回不同的指针位置还是相同的?
是的,如果他们指的是同一个对象,==
将返回true。
ArrayList将精确存储您提供给它的内容。如果你给它一个引用(“地址”),它将存储该地址。当您获取该特定元素时,您将获得相同的引用。
示例代码段:
Object o = new Object();
List<Object> l1 = new ArrayList<Object>();
List<Object> l2 = new ArrayList<Object>();
l1.add(o);
l2.add(o);
Object o1 = l1.get(0);
Object o2 = l2.get(0);
System.out.println(o1 == o2); // prints true
在某种意义上,ArrayList 确实制作了一份副本(参考文献!)正如此片段所示,更改s
时列表不受影响:
String s = "hello";
List<String> l = new ArrayList<String>();
l.add(s);
s = "world";
System.out.println(l.get(0)); // prints hello
基本上==
比较变量的内容。由于引用的内容是“地址”,因此当且仅当两个引用引用同一对象时,使用==
比较引用才会生效。
o1.equals(o2)
会比较o1
和o2
所指的实际对象。
它是否将指针位置存储为键或实际对象?如果我有两个内容相同但实际上是不同对象的对象,它还能用吗?
它使用实际对象作为键。如果您有两个单独的equal
对象,则可以使用其中任何一个来检索为该密钥存储的值。
我很确定==运算符会查看指针位置
这是挑剔,但是,不,==
查看指针内容或对象位置。
答案 1 :(得分:1)
您需要区分对象和引用。
两个不同的列表(或者通常,任何表达式)可以与同一个对象的引用相等。例如:
MyObject x = new MyObject();
MyObject y = x;
此处x
和y
是单独的变量,但它们都具有引用同一对象的值。 “引用相同的对象”是==
将要比较的内容。
如果您使用equals
,那么(假设您已在equals
中覆盖MyObject
),两个不同的对象仍然可以相等。
例如:
Integer x = new Integer(1);
Integer y = new Integer(1);
System.out.println(x == y); // False
System.out.println(x.equals(y)); // True
此处x
和y
的值是对不同对象的引用,但这些对象被认为是相等的。
那么,你的MyClass
类是否具有超越“对象身份”的对象平等概念?在比较列表中存储的参考文献时,您对哪个方面感兴趣?
答案 2 :(得分:1)
如果同一个对象已存储在两个单独的ArrayList
容器中,并且您想检查它们是否相同,请使用==
运算符检查对象标识。
这将起作用,因为只有引用存储在ArrayList
。