對(duì)于HashSet及其子類而言,它們采用hash算法來決定集合中元素的存儲(chǔ)位置,并通過hash算法來控制集合的大??;
hash表里可以存儲(chǔ)元素的位置被稱為“桶”(bucket),一般而言,單個(gè)桶里存儲(chǔ)一個(gè)元素性能是最優(yōu)的。但有時(shí)會(huì)
發(fā)生沖突,即兩個(gè)元素的hash值一樣,即它們計(jì)算出來的存儲(chǔ)位置一樣了,此時(shí)就要解決沖突問題,那么解決沖突的
方法主要有:
開放定址法
再散列函數(shù)法
鏈地址法(Java集合中采用的這種方式)
公共溢出區(qū)
hash表包含的屬性:
容量(capacity): hash表中桶的數(shù)量
初始化容量:創(chuàng)建hash表時(shí)桶的數(shù)量。HashMap和HashSet都允許再構(gòu)造器中指定初始容量
尺寸(size): hash表中當(dāng)前的存儲(chǔ)數(shù)量
負(fù)載因子(裝填因子):"size/capacity"的比值,為0時(shí),表示空的hash表,0.5表示半滿的hash表
負(fù)載極限:是一個(gè)0-1的數(shù)值,決定了hash表的最大填滿程度,當(dāng)負(fù)載因子達(dá)到了指定的負(fù)載極限時(shí),hash表會(huì)自動(dòng)成倍的增加容量(桶的數(shù)量),并將原有的對(duì)象重新分配到新的桶內(nèi),這個(gè)過程為rehashing
注意:
這個(gè)負(fù)載極限的取值會(huì)影響性能,過大過下都不好,一把取值0.75較為合理。過大雖然能降低hash表所占用的內(nèi)存時(shí)間,但會(huì)增加
查詢數(shù)據(jù)的時(shí)間開銷(因此,沖突多了,掛載的分支鏈表也就多了長了,從而查找性能不好);過小,盡管
會(huì)提高查詢性能,但容易發(fā)生rehashing,即增加hash表所占用的內(nèi)存開銷。