簡體   English   中英

哈希對 HashSet 是如何工作的?

[英]How does Hashing work for HashSet?

我剛剛閱讀並理解了哈希如何與 HashMap 一起工作:它如何使用哈希表,使用哈希函數制作哈希碼等。

我的問題是:如果同樣的原則適用於 HashSet? 顯然它無法從 HashSet 的鍵計算哈希碼,因為它沒有。 但是它會根據 HashSet 的值計算哈希碼嗎?

實際上, HashSetHashMap支持,它將其所有鍵映射到單個常量對象。 此映射的鍵集充當集合。 通過查看HashSet源代碼親自查看。 所以是的,兩者運作的機制非常相似。

HashSet 的原理是否相同?

是的, HashSet使用完全相同的一般原則:插入到集合中的鍵根據它們的哈希碼排列,使用equals方法解決沖突。

顯然,它不能從HashSet的鍵計算哈希碼,因為它沒有一個

當然有,而且可以! 事實上,哈希鍵是HashSet全部——只有鍵,沒有值。

HashMap ,“值”是被動的:它是存儲在鍵中的東西; 哈希映射從不查看值; 特別是,地圖從不檢查值是否相等,或計算它們的哈希碼。 您可以將散列集視為將所有內容映射到null的散列映射。

HashSet 在內部使用 HashMap 來存儲它的對象。 每當您創建 HashSet 對象時,也會創建一個與之關聯的 HashMap 對象。 這個 HashMap 對象用於存儲您在 HashSet 中輸入的元素。 您添加到 HashSet 中的元素存儲為此 HashMap 對象的鍵。 與這些鍵關聯的值將是一個常量。 每當您使用 add() 方法將一個元素插入到 HashSet 中時,它實際上會在內部支持的 HashMap 對象中創建一個條目,其中包含您指定為鍵的元素和名為“PRESENT”的常量作為其值。 這個“PRESENT”在HashSet類中定義如下。

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e)
{
        return map.put(e, PRESENT)==null;
}

您可以注意到,HashSet 類的 add() 方法通過傳遞您指定的元素作為鍵和常量“PRESENT”作為它的值,在內部調用支持 HashMap 對象的 put() 方法。

暫無
暫無

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

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