2012-01-26 25 views
4

A hastable在要存儲的對象上使用一些散列函數。Java字符串:hashcode實際上是散列值嗎?

這個散列函數本質上是計算表中對象的位置。

如果我們使用HashTableHashMap並且大小不能適應更多元素,那麼這些集合的大小將調整爲適應更多元素。
這意味着每個存儲的元素必須重新計算新的更大的表中的新位置。

我的問題是以下(即上面是正確的):
我讀到String計算其hashcode的,因爲它不使用它的商店和額外的hashvalue內部(緩存)存儲的字符以獲得最佳性能不必重新計算。

這是我沒有得到的部分。如果hashcode是基於String存儲的字符,那麼hashtable中的位置是如何計算的?

是否有一些額外的邏輯使用hashcodeString?所以Stringhashcode其實不是hashvalue

回答

2

哈希碼沒有改變。只有內部表中的位置是。打開HashMap和看到:

static int indexFor(int h, int length) { 
    return h & (length-1); 
} 

表中的索引(數組,實際上)是基於哈希和陣列的大小決定。因此,當發生「重新哈希」時,它使用相同的哈希碼,但長度不同,這意味着該元素被放入不同的存儲桶中。

+1

請注意,由於長度總是2的冪,所以'h&(length - 1)'相當於'h%length'(這可能是很多學生學習如何解決他們的哈希桶問題數據結構課程)。 – erickson

+0

@erickson:對不起。爲什麼'&'與'%'相同?我沒有那樣做。 – Cratylus

+1

(實際上'%'會給'h'的一半給出錯誤的答案。)@ user384706這只是一點點。在二進制中查看兩個減1的冪。 –

相關問題