簡體   English   中英

Java對象比較和帶有對象鍵的哈希表

[英]Java object comparison and Hashtable with Object keys

假設我有一個MyObject類,它存儲在2個不同的ArrayList 如果從2 ArrayList獲得相同的對象,我將如何比較它們以檢查它們是否相同?

我會執行instance1 == instance2還是instance1.equals(instance2)嗎? 我很確定==運算符會查看指針位置,但是如果我從array1獲得instance1和從array2獲得instance2,它們將返回不同的指針位置還是相同的?

與Hashtable相同:它存儲指針位置作為鍵還是實際對象? 如果我有兩個對象具有相同的內容,但實際上是不同的對象,它仍然可以工作嗎?

謝謝

如果我從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

基本上==比較變量的內容。 由於引用的內容是一個“地址”,因此當且僅當兩個引用引用相同的對象時,使用==進行比較的引用才會生成true。

o1.equals(o2)比較o1o2引用的實際對象。


它是否將指針位置存儲為鍵或實際對象? 如果我有兩個對象具有相同的內容,但實際上是不同的對象,它仍然可以工作嗎?

它使用實際對象作為鍵。 如果您有兩個equal單獨對象,則可以使用其中一個來檢索為該鍵存儲的值。


我很確定==運算符會查看指針位置

這很挑剔,但是不, ==查看指針的內容對象的位置。

您需要區分對象引用

兩個不同的列表(或者通常是任何表達式)可以相等地引用同一對象。 例如:

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類是否具有除“對象標識”之外的對象平等概念? 比較列表中存儲的參考文獻時,您對哪個方面感興趣?

如果同一對象已存儲在兩個單獨的ArrayList容器中,並且您想檢查它們是否相同,請使用==運算符檢查對象身份。

這將起作用,因為只有引用存儲在ArrayList

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM