2014-10-03 58 views
0

在做一些調試時,我意識到我使用的HashMap的表有很多空映射,爲什麼?爲什麼HashMap中有這麼多的空映射?

例如,HashMap的大小爲471.189,當它具有table=HashMap$Entry<K, V>[1048576]時,大約是所需的2.2倍。

+4

你知道哈希表是如何工作的嗎? – WilQu 2014-10-03 14:19:28

回答

4

hash table (wikipedia)的理論實現將創建大於必要的存儲空間以減少散列衝突的可能性。將密鑰值添加到散列中時,將進行計算(在密鑰值的hashCode()上)以確定密鑰將存儲在散列表中的哪個位置。這就是哈希表概念能夠快速使用的原因,哈希和哈希函數越好,碰撞越少,系統運行速度越快。

哈希表中的空白空間越大,發生碰撞的可能性越小。

如果發生碰撞,就會有一個系統允許以不同的方式存儲值,但速度仍然很快,但並不完美。

底線是一個散列表是一個權衡,折衷之間的性能和'浪費'的空間。

當您調試時,您會看到HashMap中的空白空間,這是正常的,甚至是「健康的」。當散列表(HashMap)被填滿時,它將'重新映射'數據到一個更大的散列表中。這個重新映射可能會很慢,所以,如果你知道你的哈希表將會增長到一個特定的大小,你應該預先分配空間使用capacity argument on the constructor

相關問題