簡體   English   中英

散列函數和鍵

[英]Hashing function and keys

在瀏覽Kathy Sierra的書時,我偶然發現了這段代碼:

m.put("k1", new Dog("aiko"));   // add some key/value pairs
m.put("k2", Pets.DOG);
m.put(Pets.CAT, "CAT key");
Dog d1 = new Dog("clover");
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");

地圖用於以密鑰和值格式存儲內容。 當我們輸入“k1”或新的Cat()作為鍵時,有人會告訴我實際存儲在鍵中的內容嗎? 是存儲對這些對象的引用還是哈希碼的值? 我完全對此感到困惑。 請指教。

如果你能指出我進一步閱讀材料,將不勝感激。

地圖是N個桶的數組。

put()方法首先在鍵上調用hashCode() 從這個哈希碼中,它使用模數來獲取地圖中存儲桶的索引。

然后,它遍歷存儲在與找到的存儲桶關聯的鏈接列表中的條目,並使用equals()方法將每個條目鍵與您的密鑰進行比較。

如果一個條目的密鑰等於您的密鑰,則其值將替換為新值。 否則,使用新密鑰和新值創建新條目,並將其存儲在與存儲桶關聯的鏈接列表中。

由於Cat實例和String實例永遠不會相等,因此永遠不會通過放置與Cat鍵關聯的值來修改與String鍵關聯的值。

它將由您的對象定義。

您必須創建一個hashCode()和一個equals()方法,以便它可以存儲在您的哈希表中。

盡可能合理,Object類定義的hashCode方法確實為不同的對象返回不同的整數。 (這通常通過將對象的內部地址轉換為整數來實現,但JavaTM編程語言不需要此實現技術。)

請參閱java.lang.Object中的javadoc http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#hashCode ()

或者你可以閱讀這個解釋http://www.javaworld.com/javaworld/javaqa/2002-06/01-qa-0621-hashtable.html

我希望它有所幫助

將值存儲到HashMap取決於hashcode()equals() 。請從此處找到更多引用。

HashMap - hashcode()示例

有關HashMap get()檢索值的更多信息。 這里

使用HashMap時,其中的鍵是唯一的。 在Java中根據所考慮對象的類提供的equals()和hashCode()方法的定義來檢查密鑰的唯一性。

這是通過首先使用equals()方法進行比較並且如果它返回相等然后使用hashCode()進行比較來完成的。此外,您必須知道指向對象的每個引用都有一個位模式,對於多個引用可能不同同一個對象。

因此,一旦equals()測試通過,對象將不會插入到地圖中,因為地圖應該具有唯一鍵。 因此,作為映射中的鍵的對象的每個hashCode值將為一系列hashCode值形成不同的桶,並且對象將相應地分組。

編輯提供一個例子:

例如,讓我們考慮兩個對象具有值為“hello”和“hlleo”的String屬性,並假設hashCode()函數被編程為使得對象的哈希碼是字符的ASCII值的總和。如果String屬性的值相等,則String屬性和equals()方法返回true。

因此,在上面的情況中,equals()返回false,因為字符串不相等但hashCode將是相同的。 因此,這兩個對象將被放置在相同的哈希碼桶中。

希望有所幫助。

暫無
暫無

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

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