Java对象比较和带有Object键的Hashtable

时间:2011-10-05 19:18:32

标签: java

假设我有一个MyObject类,它存储在两个不同的ArrayList中。如果从2 ArrayList获取相同的对象,我将如何比较它们以检查它们是否相同?

我会instance1 == instance2还是instance1.equals(instance2)?我很确定==运算符会查看指针位置,但如果我从array1获取instance1而从array2获取instance2,它们会返回不同的指针位置还是相同的?

与Hashtable相同:它是否将指针位置存储为键或实际对象?如果我有2个具有相同内容但实际上是不同对象的对象,它仍然可以工作吗?

由于

3 个答案:

答案 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)会比较o1o2所指的实际对象。


  

它是否将指针位置存储为键或实际对象?如果我有两个内容相同但实际上是不同对象的对象,它还能用吗?

它使用实际对象作为键。如果您有两个单独的equal对象,则可以使用其中任何一个来检索为该密钥存储的值。


  

我很确定==运算符会查看指针位置

这是挑剔,但是,不,==查看指针内容对象位置。

答案 1 :(得分:1)

您需要区分对象引用

两个不同的列表(或者通常,任何表达式)可以与同一个对象的引用相等。例如:

MyObject x = new MyObject();
MyObject y = x;

此处xy是单独的变量,但它们都具有引用同一对象的值。 “引用相同的对象”是==将要比较的内容。

如果您使用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

此处xy的值是对不同对象的引用,但这些对象被认为是相等的。

那么,你的MyClass类是否具有超越“对象身份”的对象平等概念?在比较列表中存储的参考文献时,您对哪个方面感兴趣?

答案 2 :(得分:1)

如果同一个对象已存储在两个单独的ArrayList容器中,并且您想检查它们是否相同,请使用==运算符检查对象标识。

这将起作用,因为只有引用存储在ArrayList