2011-10-05 76 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