<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      JDK1.8 HashMap源碼分析

      用到的符號:

           ^異或運算:兩個操作數相同,結果是0;兩個操作數不同,結果是1。

           &按位與:兩個操作數都是1,結果才是1。

      一、HashMap概述

           在JDK1.8之前,HashMap采用數組+鏈表實現,即使用鏈表處理沖突,同一hash值的鏈表都存儲在一個鏈表里。但是當位于一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查找的效率較低。而JDK1.8中,HashMap采用數組+鏈表+紅黑樹(二叉樹的優化實現是一種平衡二叉樹,可以降低樹的深度)實現,當鏈表長度超過閾值(8)時,將鏈表轉換為紅黑樹,這樣大大減少了查找時間。

            

       

          jdk1.8之前的hashmap都采用上圖的結構,都是基于一個數組和多個單鏈表,hash值沖突的時候,就將對應節點以鏈表的形式存儲。如果在一個鏈表中查找其中一個節點時,將會花費O(n)的查找時間,會有很大的性能損失。到了jdk1.8,當同一個hash值的節點數不小于8時,不再采用單鏈表形式存儲,而是采用紅黑樹。

                            

      二、了解Hash函數

         我們先了解一下Hash的源碼:

          

          代碼執行過程:如果key為空,返回0;如果key不為空,返回原hash值和原hash值無符號右移16位的值按位異或的結果。(把低16位和高16位進行異或運算)。因為低位重復概率比較大,低位和高位異或運算可以提交數組的利用率,使數組分布均勻。

          按位異或就是把兩個數按二進制,相同就取0,不同就取1。

          比如:0101 ^ 1110 的結果為 1011,異或的速度是非常快的。

         把一個數右移16位即丟棄低16為,就是任何小于216的數,右移16后結果都為0(2的16次方再右移剛好就是1)。

         任何一個數,與0按位異或的結果都是這個數本身。

         所以這個hash()函數對于非null的hash值,僅在其大于等于216的時候才會重新調整其值。

         但是調整后又什么好處呢?

         我們先看下put的時候,這個hash值是怎么處理(部分源碼)的:

         

          在尋找桶位的時候,這個hash值為與上table的zise-1,初始為16,我們就拿16來舉例.

          以為算法是hashValue & size - 1 ,此時size-1=15的二進制為 1 1 1 1 ,也就是任意類似16進制0x?0(二進制最后四位為0000)的hash值,都會被存儲到位置為0的桶位上,一個桶中的元素太多,就一定會降低其性能。我們知道HashMap是一個數組+鏈表,就是在下標相同的位置下面掛一個單項的鏈表,那數組的下標需要計算出來,必須保證在一定的范圍內,是通過【(n-1)&hash】計算機計算的是二進制,比如數組大小必須是2的N次冪,權重是0.75,數組初始值是16,權重等于12(16*0.75),當等于12數組會擴容。擴容之后對數組進行重新分配。當鏈表的大小大于8的時候會轉化為紅黑樹。數組下標計算方式:(0101010101010101010101010101&00000000000000000001111)以16來說,十六進制的二進制表示后面的0,N-1的二進制結尾是1111,兩者進行與操作最大值是1111,1111的16十六進制是15,然后把Node節點放入這個位置,這樣來計算下標。

      總結如下:

       

      posted on 2016-11-13 18:13  安卓筆記俠  閱讀(557)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 久久综合国产精品一区二区| 亚洲va久久久噜噜噜久久狠狠| 加勒比色综合久久久久久久久| 中文字幕无线码在线观看| 欧美精品国产一区二区三区| 铜陵市| 97se亚洲国产综合自在线观看| VA在线看国产免费| 日韩国产成人精品视频| 国产精品久久久久久久久鸭| 噜噜综合亚洲av中文无码| 亚洲第一香蕉视频啪啪爽| 精品偷拍一区二区三区| 久久日韩在线观看视频| 无码人妻丝袜在线视频红杏 | 她也色tayese在线视频| 亚洲 日本 欧洲 欧美 视频| 亚洲线精品一区二区三八戒 | 亚洲天堂一区二区三区四区| 亚洲国产精品久久久久4婷婷| 日韩高清国产中文字幕| 男人的天堂av一二三区| 伊人天天久大香线蕉av色| 日夜啪啪一区二区三区| 国产色a在线观看| 国产亚洲欧美另类一区二区| 光泽县| 亚洲午夜亚洲精品国产成人| 亚洲AVAV天堂AV在线网阿V| 国内精品久久久久久无码不卡| 国产精品免费AⅤ片在线观看| 正在播放国产剧情亂倫| 日韩丝袜欧美人妻制服| 四虎成人精品无码| 无码人妻丰满熟妇区毛片18| 日本福利一区二区精品| 性男女做视频观看网站| 欧美日韩免费专区在线观看 | 国产精品女生自拍第一区| 午夜免费无码福利视频麻豆| 澄江县|