1. 程式人生 > >JAVA 8 主要新特性 ----------------(二)版本中資料結構的修改淺析

JAVA 8 主要新特性 ----------------(二)版本中資料結構的修改淺析

一、版本中資料結構的修改淺析
1、HashMap、HashSet、ConcurrentHashMap的資料結構發生變化

  (1)HashMap簡介(結構:雜湊表+連結串列)

         HashMap儲存的資料是無序的,結構雜湊表加連結串列的儲存方式,key不能重複,雜湊表就是陣列,儲存的陣列都是entry,初始大小預設是16,HashMap底層使用雜湊演算法原理:當建立一個物件,想要加入到HashMap,會預設呼叫底層的一個方法hashCode()。

         HashMap算出索引值,會上對應的連結串列中找是否有物件,如果沒有物件,沒有直接新增,如果有物件,通過equals比較兩個物件,如果內容一樣,將視為重複元素,後邊的將前邊的覆蓋掉.內容不一樣,JDK1.7中,不一樣的時候生成一個連結串列,後加入的跟前邊的生成連結串列,稱為"碰撞","碰撞"過多的時候,下次新增就會更多個值進行equals,效率會極低.如何避免?無法避免。
         

如果不採用上述方式,就需要每次新增都equals比較,並且還要比較下一次新增的值,效率會大大降低。

         HashMap具有載入因子,是0.75,當雜湊表達到75%的時候,就會進行擴容,擴容是原來長度的2倍.一旦擴容,發生碰撞的元素就會進行重新排序.將元素放到新的位置上去,以解決"碰撞"問題.          HashMap把Key和Value封裝到entry物件中,還是無法避免碰撞問題。   (2)Java8中HashMap的資料結構發生變化(結構:陣列+連結串列+紅黑樹)

         新版設計:

             當HashMap中的某一個連結串列的長度大於8,並且元素總容量大於64的時候,連結串列就會變為二叉樹中的紅黑樹.           優勢:除了新增,其他的效率都提高了.1.8前新增的重複元素直接新增在連結串列最後,1.8中需要跟紅黑樹的子節點進行比較,最後找到合理的位置新增.   查詢提速,原來是遍歷整個連結串列,挨個比較查詢值.
        現在二叉樹節點比較查詢,查詢的節點數目減少。   (3)HashSet也會更新,因為HashSet的底層就是HashMap。   (4)ConcurrentHashMap簡述           鎖分段(鎖分離)機制1.8以前   也進行了更改,以往HashMap執行緒不安全的處理方案是加鎖,但是效率極低,1.8以前,它有個預設併發級別是16,每個段都是執行緒安全的,在每個段中對應著一個HashMap,意味著一次能有16個執行緒訪問HashMap.          無鎖演算法1.8以後      1.8前存在問題:併發級別段的大小不好控制,過大浪費資源,過小操作不便.      1.8中取消了併發級別段,採用了CAS演算法,其實是一個底層硬體的演算法,底層硬體對於併發的一個支援,效率比鎖的高,CAS演算法又稱為無鎖演算法。   (5)JVM支援的記憶體結構發生改變            JVM擁有兩塊虛擬的記憶體空間,一部分稱之為棧,一部分稱之為堆.還有一部分為方法區.           方法區是屬於堆記憶體的,堆記憶體分為垃圾回收區和永久區,方法區屬於永久區的一部分.          JVM分類(不同廠商):                 Oracle-Sun Hotspot                  Oracle(自己生產的) JRocket                 IBM   J9                 Alibaba(國產) Taobao          1.8以前只有Hotspot的版本有永久區,其他廠商獨立分割槽.(永久區儲存類載入資訊)           1.8以後JVM變化:               1.8中刪除了JVm中的永久區.獨立分出一片區域叫做MetaSpace(元空間),元空間採用實體記憶體,伺服器記憶體空間多大,MetaSpace就有多大.OOM錯誤發生概率降低.(除非一個無限建立的類載入),由於垃圾回收機制改為元空間將要滿的時候才垃圾回收,垃圾回收執行的次數減少了,效率提高了.               永久區中調優屬性PermGenSize和MaxPermGenSize,改為MetaSpaceSize和MaxMetaSpaceSize

注:

    雜湊演算法:

           雜湊演算法是將hashCode()生成的值,進行一個運算(雜湊演算法運算),運算成對應的陣列的索引值,這就是雜湊演算法.