Java集合框架 -- 03 hash算法在集合中的應(yīng)用及分析

對(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)存開銷。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 實(shí)際上,HashSet 和 HashMap 之間有很多相似之處,對(duì)于 HashSet 而言,系統(tǒng)采用 Hash 算...
    曹振華閱讀 2,561評(píng)論 1 37
  • title: java集合框架學(xué)習(xí)總結(jié) tags:集合框架 categories:總結(jié) date: 2017-03...
    行徑行閱讀 1,815評(píng)論 0 2
  • HashMap 是 Java 面試必考的知識(shí)點(diǎn),面試官從這個(gè)小知識(shí)點(diǎn)就可以了解我們對(duì) Java 基礎(chǔ)的掌握程度。網(wǎng)...
    野狗子嗷嗷嗷閱讀 6,805評(píng)論 9 107
  • 我來到你的世界 帶著期盼 帶著渴望 跟隨著一份靈魂的感覺 意念播撒 愛 已出發(fā) 沒人能告訴我結(jié)局是什么 一路踉蹌前...
    陽光姐姐何姐閱讀 329評(píng)論 0 0
  • 突然覺得我有哥可是沒有這種感覺啊。我甚至是看完了這篇文章才想起來自己也是有個(gè)大兩歲的親哥的。唉,不知道是你的悲哀還...
    胖球66閱讀 369評(píng)論 0 1

友情鏈接更多精彩內(nèi)容