2011-10-05 73 views
0

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

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

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

感谢

+0

你问题的最后部分是非常不清楚的 - 请编辑你的问题来澄清它。 –

+0

是的,编辑。希望有所帮助。 – Pwnna

回答

1

如果我从数组2阵列1和I​​NSTANCE2得到INSTANCE1,他们将返回不同的指针位置或相同?

是的,如果他们都指的是同一个对象,==将返回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,则可以使用其中一个来检索为该密钥存储的值。


我敢肯定==操作符看起来在指针位置

这是吹毛求疵,但是,没有,==看着指针内容,或对象位置。

+0

我可以看到这是有效的,但是因为l1和l2是单独的对象,它们是不是每个都有不同的内存地址?列表/基元数组'=='与普通对象比较有所不同吗? – JustinKSU

+0

不,没有什么特别的'List'或数组。列表和数组都是对象,当你有包含对这些对象的引用的变量时,'=='的工作方式与任何其他引用一样。 – aioobe

+0

RTFC。我认为它说(l1 == l2)不是你写的。无论如何谢谢澄清。 – JustinKSU

1

您需要区分对象参考文献

两个不同的列表(或一般来说,任何表达式)可以等于引用到同一个对象。例如:

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

这里xy是独立的变量,但它们都具有指的是同一个对象的值。这个“指的是同一个对象”是==将会比较的。

如果使用equals然后(假设你已经在MyObject覆盖equals)两大不同对象仍然可以相等。

例如:

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类是否有一个超越“对象标识”的对象平等概念?当您比较存储在列表中的引用时,您对哪一方面感兴趣?

+1

我知道,但是,我需要知道ArrayList是否需要引用或创建新对象。 – Pwnna

+1

@ultimatebuster:那么这根本就不是你*所要求的 - 但不是,Java中的集合不会自动克隆对象。你传入一个*引用*到'add'方法(或其他),并且引用被添加到列表中。如果你想创建一个克隆,你必须自己做。 –

1

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

这将工作,因为只有参考文件存储在ArrayList