hash,hashcode,hashmap以及bucket怎么理解
HashMap:HashMap是一個用于存儲Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散存儲在一個數(shù)組當中,這個數(shù)組就是HashMap的主干,數(shù)組每一個元素的初始值都是Null。
hashcode(又稱為hash碼):hashcode代表對象的地址說的是對象在hash表中的位置,物理地址說的對象存放在內(nèi)存中的地址。其作用就是用來對hashmap的快速查找(畢竟相當于一個地址),是通過對key的計算得到的整型數(shù)。
hash值:hash值是通過對計算得到的hashcode進行進一步計算得到的值,其目的是保證最終的存儲盡可能的散列到數(shù)組中。
最后會通過以下函數(shù)
static int indexFor(int h, int length) {
return h & (length-1);
}
求出index 也就是對應(yīng)的存儲數(shù)組位置下標。
bucket:所謂bucket就是對于 HashMap 及其子類而言,它們采用 Hash 算法來決定集合中元素的存儲位置。當系統(tǒng)開始初始化 HashMap 時,系統(tǒng)會創(chuàng)建一個長度為 capacity 的 Entry 數(shù)組,這個數(shù)組里可以存儲元素的位置被稱為“桶(bucket)”,每個 bucket 都有其指定索引,系統(tǒng)可以根據(jù)其索引快速訪問該 bucket 里存儲的元素。
無論何時,HashMap 的每個“桶”只存儲一個元素(也就是一個 Entry),由于 Entry 對象可以包含一個引用變量(就是 Entry 構(gòu)造器的的最后一個參數(shù))用于指向下一個 Entry,因此可能出現(xiàn)的情況是:HashMap 的 bucket 中只有一個 Entry,但這個 Entry 指向另一個 Entry ——這就形成了一個 Entry 鏈。(歸納起來簡單地說,HashMap 在底層將 key-value 當成一個整體進行處理,這個整體就是一個 Entry 對象。)
HashMap 底層采用一個 Entry[] 數(shù)組來保存所有的 key-value 對,當需要存儲一個 Entry 對象時,會根據(jù) Hash 算法來決定其存儲位置;當需要取出一個 Entry 時,也會根據(jù) Hash 算法找到其存儲位置,直接取出該 Entry。由此可見:HashMap 之所以能快速存、取它所包含的 Entry,完全類似于現(xiàn)實生活中母親從小教我們的:不同的東西要放在不同的位置,需要時才能快速找到它。
當創(chuàng)建 HashMap 時,有一個默認的負載因子(load factor),其默認值為 0.75,這是時間和空間成本上一種折衷:增大負載因子可以減少 Hash 表(就是那個 Entry 數(shù)組)所占用的內(nèi)存空間,但會增加查詢數(shù)據(jù)的時間開銷,而查詢是最頻繁的的操作(HashMap 的 get() 與 put() 方法都要用到查詢);減小負載因子會提高數(shù)據(jù)查詢的性能,但會增加 Hash 表所占用的內(nèi)存空間。
掌握了上面知識之后,我們可以在創(chuàng)建 HashMap 時根據(jù)實際需要適當?shù)卣{(diào)整 load factor 的值;如果程序比較關(guān)心空間開銷、內(nèi)存比較緊張,可以適當?shù)卦黾迂撦d因子;如果程序比較關(guān)心時間開銷,內(nèi)存比較寬裕則可以適當?shù)臏p少負載因子。通常情況下,程序員無需改變負載因子的值。
如果開始就知道 HashMap 會保存多個 key-value 對,可以在創(chuàng)建時就使用較大的初始化容量,如果 HashMap 中 Entry 的數(shù)量一直不會超過極限容量(capacity * load factor),HashMap 就無需調(diào)用 resize() 方法重新分配 table 數(shù)組,從而保證較好的性能。當然,開始就將初始容量設(shè)置太高可能會浪費空間(系統(tǒng)需要創(chuàng)建一個長度為 capacity 的 Entry 數(shù)組),因此創(chuàng)建 HashMap 時初始化容量設(shè)置也需要小心對待。
如何存取也是要注意的問題,應(yīng)該是先判斷hash值也就是hashcode是否相同,不同就直接存取,相同就再調(diào)用.equals方法判斷里面的內(nèi)容是否相同,不同就再進行存取。相同就存不進來,因為這代表是兩個相同的東西,存不進來也就不可能有取的操作了。
總結(jié)
以上是生活随笔為你收集整理的hash,hashcode,hashmap以及bucket怎么理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机桌面出现模糊窗口,显示屏模糊,教您
- 下一篇: 心愿,一首校园原创歌曲(附四位女生的照片