簡體   English   中英

集合中的Object.equals方法的后台工作?

[英]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>

但是,當在要添加的元素和集合的當前元素之間進行比較時,將考慮對象類型的 equalshashCode方法。 因此,當您再次添加1010時,它將在執行時使用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.

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