簡體   English   中英

哈希碼和基於哈希的集合(即HashMap和HashSet)之間有什么關系?

[英]What is the relation between hashcode and hash-based collections (i.e. HashMap and HashSet)?

我在這里讀過

對象的哈希碼允許算法和數據結構將對象放入隔離專區,就像在打印機類型的情況下使用字母類型一樣。 打印機將所有“ A”類型都放入“ A”的隔間中,而他只在這個隔間中尋找“ A”。 這個簡單的系統使他查找類型比在未分類的抽屜中搜索要快得多。 這也是基於哈希的集合(例如HashMap和HashSet)的想法。

但是我不明白。 這里提到什么主意 HashMap或HashSet與哈希碼有何關系?


編輯:

HashSet為例。

假設它存儲了7個對象(用字母表示),它們可以是從A到E的任何東西。因此,假設它在第0個索引位置處有A,在第一個位置處有B,在第2個位置處有第三個索引,然后再有A在第四索引處,然后在第五索引處是D,在第六索引處是E。 等等。 這是一種存儲方式。

hashSet => [A,B,C,A,A,D,E]

然后是另一種存儲方式,所有三個A進入一個隔間,然后B進入另一個隔間,C進入另一個隔間,D和E進入另外兩個隔間。

基於hashCode的分類=> [A,A,A],[B],[C],[D],[E]

現在,如果我檢查hashSet.contains('A') ,它將直接查看包含第一個隔離專區A的隔離專區,並A.equals(member-of-compartment)的每個成員計算A.equals(member-of-compartment)

我對嗎?

HashMap或HashSet就像帶隔層的抽屜。 這些數據結構使用hashCode將對象放在正確的隔離專區中。

String的第一個字母是一個非常簡單的String哈希碼(不是J​​ava使用的hashCode,但在現實生活中使用很多)。 這就是很多人用來將東西放在正確隔間中的方式。

因此,HashMap和HashSet都首先根據hashCode查找正確的隔離專區以搜索對象。 一旦有了正確的隔層,他們便會從前向后看一遍,找到合適的物體(但理想情況下,每個隔間中只有很少的物體)

編輯

您在編輯中對HashSet的看法是正確的。 (如果將hashCode函數實現為始終返回相同的值(例如零),則它將像“ hashSet => [A,B,C,A,A,D,E]”一樣工作-它將所有內容放入一個存儲桶中/隔間)

請注意,HashMap和HashSet在實現方式上幾乎沒有什么區別。 HashSet只是一個HashMap,它僅使用鍵並使用單個預定義值來指示鍵在地圖中存在。

基於散列的集合通常稱為存儲桶 具有相同哈希碼的所有對象將進入同一存儲桶。 這與打印機類型案例的想法相同。 基於散列的集合的存儲桶就像打印機的類型箱格。

所有“ A”都進入同一個隔離專區,就像所有具有相同哈希碼的對象都進入同一個存儲桶一樣。

打印機根據它是哪個字母來決定哪個格,而與類型無關。 這里的“哈希碼”操作是類型的字母。

同樣,基於散列的集合需要找到對象所屬的存儲桶。 他們通過獲取對象的哈希碼來做到這一點。

就像打印機只需要在“ A”部分中查找以查找所需的特定“ A”一樣,基於散列的集合將調用hashCode()方法來確定要查找哪個桶來查找對象。

打印機仍然需要目視檢查隔間中的每個對象是否需要他/她。 同樣,即使多個對象位於同一存儲桶中,基於散列的集合仍需要找到正確的對象。 基於散列的集合調用equals查看對象的鍵是否存在。

暫無
暫無

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

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