[英]Background working of the Object.equals method in the collection?
HashSet hs = new HashSet();
hs.add(10);
hs.add("sum");
hs.add(10);
hs.add(12.3d);
System.out.println(hs);
1)在上面的代碼中,java如何知道當第二個對象傳遞時,它不需要與第一個對象進行檢查。 以及如何知道當第三個對象(即10)通過時,它需要調用Integer類的重寫的.equals方法來檢查第一個和第三個對象。
2)如果調用對象類的.equals方法,則兩個整數都有不同的實例,因此應將兩者都添加,但事實並非如此。
我需要集合中.equals方法的后台工作!
equals
不會在所有情況下都考慮實例。 基本上,這是一個自定義實現,具體取決於對象的類型,默認情況下,僅比較引用即可。 您可以想象Integer::equals
boolean equals(Object other) {
boolean isSameType = other instanceof Integer;
return isSameType && ((Integer)other).value == value;
}
因此,兩個具有相同值的Integer
實例將被視為相等。 另外,您正在處理HashSet<T>
因此必須考慮int hashCode()
,這應與equals
實現一致。
您的HashSet
沒有使用泛型進行參數化,因此您正確地認為它將被視為HashSet<Object>
。
但是,當在要添加的元素和集合的當前元素之間進行比較時,將考慮對象類型的 equals
和hashCode
方法。 因此,當您再次添加10
和10
時,它將在執行時使用Integer.equals
確定相等性。
HashSet<Object>
僅處理引用類型 Object
,這意味着編譯器要求HashSet
中的所有對象都是Object
的實例或擴展Object
(當然,所有對象都是對象)。 這與方法的執行無關,但是其行為由實際對象的類型定義。
概括地說,如果我定義:
Object obj = new Integer(10);
我打電話給:
obj.equals(anotherObj);
編譯器將確保引用類型 ( Object
)具有稱為equals
的方法,並在運行時執行對象類型 ( Integer
)的行為。
Set中的唯一性,在內部通過HashMap在java中。 每當您創建HashSet對象時,它都會創建一個HashMap對象。 我們在HashMap中知道每個鍵都是唯一的。 如果key不為null,則它將在鍵對象即key.hashCode()上調用哈希函數,因此在key.hashCode()返回hashValue之后,它看起來像是-int hash = hash(hashValue) ,現在,它適用返回hashValue轉換為自己的哈希函數。 final 哈希值用於查找存儲Entry對象的存儲桶位置 。 入口對象像這樣存儲在存儲桶中(哈希,鍵,值,存儲桶索引)。 因此,我們遍歷鏈表, 使用keys.equals()比較每個條目中的鍵,直到返回true。 然后返回相應的入口對象Value,即,如果兩個對象的哈希值相同,則將調用equals方法以驗證其是否相同。 如果沒有,則對象將找到它在存儲桶(鏈接列表)中的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.