Java之集合的實現細節(一)__Java

來源:互聯網
上載者:User
Set和Map 通過繼承關係體系,我們可以得出 Set<->Map EnumSet<->EnumMap SortedSet<->SortedMap TreeSet<->TreeMap NavigableSet<->NavigableMap HashSet<->HashMap LinkedHashSet<->LinkeHashMap 表面上這兩種集合沒有太大關係,但是如果只考慮Map集合的key,不難發現,這些Map集合的key具有一個特徵:所有key不能重複,無順序。將Map集合所有的key集中起來,就是一個set集合。Map集合提供了一個方法來返回所有key組成的Set集合。 Set<K>keySet(); 對於一個Map集合而言,其實是一個關聯陣列.Map總是可以根據該key快速查詢對應的value,那麼Map集合在儲存key-value時可以只考慮key即可。 只要對傳統的set稍微做改造,就可以將set改造成map集合,這個map集合功能幾乎可以與系統提供的map媲美。
HashMap和HashSet HashSet和HashMap之間有很多相似之處,對於HashSet而言,系統採用Hash演算法決定集合元素的儲存位置,可以保證快速存、取集合元素。對於HashMap而言,系統將value當成key的附屬,系統根據Hash演算法來決定key的儲存位置,這樣可以保證快速存、取集合key,而value總是緊跟隨key儲存。 雖然集合號稱儲存是Java對象,但實際上並不會真正將Java對象放Set集合中,而只是Set集合中保留這些對象的引用而言,Java集合實際上是多個引用變數所組成的集合,這些引用變數指向實際的Java對象。 參考型別的數組一樣,當把Java對象放入數組之時,並不是真正把Java對象放入數組中,而只是把對象的引用放入數組中,每個數組元素都是一個引用變數。 當hashmap的每個bucket裡儲存的Entry只是單個Entry,既沒有通過指標產生Entry鏈時,此時的HashMap具有最好的效能。 當程式通過key取出對應的value時,系統只要計算該key的hashcode()值,再根據該hashcode值找出該key在table中數組中的索引,然後取出該索引出的Entry,最後返回該key對應的value值。在發生"Hash衝突"的情況下,單個 bucket存在的不是一個entry值而是entry鏈,系統必須按順序遍曆每個Entry鏈,直到找到想搜尋的Entry為止。如果恰好要搜尋的entry位於該entry鏈的最末端,必須迴圈到最好才能找到該元素。
HashMap在底層將key-value當成一個整體進行處理,這個整體就是一個Entry對象。HashMap底層採用一個Entry[]數組來儲存所有的key-value對,當需要儲存一個Entry對象時,會根據Hash演算法來決定其儲存位置。當需要取出一個Entry時,也會根據Hash演算法找到其儲存位置,直接取出該Entry。 HashMap之所以能快速存、取它所包含的Entry時,完全類似於現實生活中的:不同東西要放在不同位置,需要時才能快速找到它。
當建立HashMap時,有一個預設的負載因子,其預設值為0.75。這是時間和空間成本的一種折衷:增大負載因子可以減少Hash表所佔用的記憶體,但是會增加查詢資料的時間開銷,而查詢最頻繁的操作(put和get方法都需要用到查詢);減少負載因子的話會提高資料查詢效能,但會降低Hash表所佔用的記憶體空間。
在建立HashMap時根據實際需要調整load factor的值。如果程式比較關心空間開銷,記憶體比較緊張的話,可以適當增加負載因子。如果程式比較關心時間開銷,記憶體比較寬裕,則可以減少負載因子。通常情況下,不需要改變負載因子。
如果開始就知道hashMap會儲存多個key-value值,可以在建立時就使用較大的初始化容量,如果HashMap中的Entry的數量一直不會超過極限容量,HashMap就無需調用resize()方法重新分配table組,從而保證較好的效能。當然,開始就將初始容量設定太高可能會浪費空間。因此建立HashMap時初始化容量設定也需要小心對待。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.