對(duì)于HashSet及其子類(lèi)而言丹喻,它們采用hash算法來(lái)決定集合中元素的存儲(chǔ)位置砸紊,并通過(guò)hash算法來(lái)控制集合的大邢妇巍瓦呼;
hash表里可以存儲(chǔ)元素的位置被稱(chēng)為“桶”(bucket),一般而言蛋铆,單個(gè)桶里存儲(chǔ)一個(gè)元素性能是最優(yōu)的娜膘。但有時(shí)會(huì)
發(fā)生沖突痕届,即兩個(gè)元素的hash值一樣衡瓶,即它們計(jì)算出來(lái)的存儲(chǔ)位置一樣了徘公,此時(shí)就要解決沖突問(wèn)題,那么解決沖突的
方法主要有:
開(kāi)放定址法
再散列函數(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表示半滿(mǎn)的hash表
負(fù)載極限:是一個(gè)0-1的數(shù)值缭裆,決定了hash表的最大填滿(mǎn)程度,當(dāng)負(fù)載因子達(dá)到了指定的負(fù)載極限時(shí)寿烟,hash表會(huì)自動(dòng)成倍的增加容量(桶的數(shù)量),并將原有的對(duì)象重新分配到新的桶內(nèi),這個(gè)過(guò)程為rehashing
注意:
這個(gè)負(fù)載極限的取值會(huì)影響性能辛燥,過(guò)大過(guò)下都不好筛武,一把取值0.75較為合理。過(guò)大雖然能降低hash表所占用的內(nèi)存時(shí)間挎塌,但會(huì)增加
查詢(xún)數(shù)據(jù)的時(shí)間開(kāi)銷(xiāo)(因此徘六,沖突多了,掛載的分支鏈表也就多了長(zhǎng)了榴都,從而查找性能不好)待锈;過(guò)小,盡管
會(huì)提高查詢(xún)性能嘴高,但容易發(fā)生rehashing竿音,即增加hash表所占用的內(nèi)存開(kāi)銷(xiāo)。