亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

hashMap擴容時應(yīng)該注意這些死循環(huán)問題

 更新時間:2021年06月10日 11:39:36   作者:攻城獅numberOne  
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著hashMap擴容時的死循環(huán)問題展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下

hashMap死循環(huán)

1.原因: jdk1.7時使用頭插入法 ,1.8之后改成了尾插入法解決了這個問題

HashMap死循環(huán)問題圖解

在HashMap的數(shù)組真實長度達到閾值后,會調(diào)用擴容方法:

void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }
 
        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable, initHashSeedAsNeeded(newCapacity));
        table = newTable;
        threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
    }

這里可以看到如果有兩個線程A和B,那么在調(diào)用transfer方法之前會在各自的線程中創(chuàng)建新的數(shù)組,然后進入到transfer方法中將節(jié)點轉(zhuǎn)移,再看transfer方法:

void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
        for (Entry<K,V> e : table) {
            while(null != e) {
                Entry<K,V> next = e.next;   ------(1)
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            }
        }
    }

我在上面的程序中標(biāo)記了一個(1),待會會用到,首先假設(shè)HashMap中的結(jié)構(gòu)是這樣的:

  

那么線程A如果執(zhí)行到(1)的位置,那么e為節(jié)點5,next為節(jié)點6,這個時候線程B開始運行,在自己的擴容數(shù)組里面運行:

e.next = newTable[i];
newTable[i] = e;

這個時候結(jié)構(gòu)圖: 

 

然后e=next; 
在進入循環(huán)執(zhí)行:

e.next = newTable[i];
newTable[i] = e;

這個時候結(jié)構(gòu)為: 

然后線程B執(zhí)行完畢。線程A開始從(1)后面繼續(xù)執(zhí)行,這個時候也是先執(zhí)行

e.next = newTable[i];
newTable[i] = e;

 

然后e=next;這個時候e是節(jié)點6,然后再進入循環(huán),執(zhí)行上面兩行程序后的結(jié)構(gòu)如下: 

但是這個時候由于6的next是有值的,是節(jié)點5,所以再執(zhí)行e=next;的時候,e不為空,還會進入一次循環(huán),在執(zhí)行將節(jié)點插入頭部的操作,所以這個時候的結(jié)構(gòu)圖:

可以,看到已經(jīng)成為了環(huán)狀鏈表,當(dāng)執(zhí)行g(shù)et操作的時候就會產(chǎn)生死循環(huán)。 

到此這篇關(guān)于hashMap擴容時應(yīng)該注意這些死循環(huán)問題的文章就介紹到這了,更多相關(guān)hashMap擴容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決

    詳解Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決

    本篇文章主要介紹了Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 詳解java中保持compareTo和equals同步

    詳解java中保持compareTo和equals同步

    這篇文章主要介紹了詳解java中保持compareTo和equals同步的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java高并發(fā)下鎖的優(yōu)化詳解

    Java高并發(fā)下鎖的優(yōu)化詳解

    這篇文章主要介紹了Java高并發(fā)下鎖的優(yōu)化詳解,鎖是最常用的同步方法之一,在高并發(fā)的環(huán)境下,激烈的鎖競爭會導(dǎo)致程序的性能下降,下面是一些關(guān)于鎖的使用建議,可以把這種副作用降到最低,需要的朋友可以參考下
    2024-01-01
  • Java Swagger技術(shù)使用指南

    Java Swagger技術(shù)使用指南

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)??傮w目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2021-09-09
  • Java使用GUI繪制線條的示例

    Java使用GUI繪制線條的示例

    這篇文章主要介紹了Java使用GUI繪制線條的示例,幫助大家更好的理解和學(xué)習(xí)java gui編程,感興趣的朋友可以了解下
    2020-09-09
  • Spring Security其它權(quán)限校驗方式&自定義權(quán)限校驗方式

    Spring Security其它權(quán)限校驗方式&自定義權(quán)限校驗方式

    這篇文章主要介紹了Spring Security其它權(quán)限校驗方式&自定義權(quán)限校驗方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java servlet手機app訪問接口(三)高德地圖云存儲及檢索

    java servlet手機app訪問接口(三)高德地圖云存儲及檢索

    這篇文章主要為大家詳細介紹了java servlet手機app訪問接口(三),高德地圖云存儲及檢索,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 基于Java實現(xiàn)一個自己的HTTP瀏覽器

    基于Java實現(xiàn)一個自己的HTTP瀏覽器

    這篇文章主要為大家詳細介紹了如何基于Java實現(xiàn)一個自己的HTTP瀏覽器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • SpringCloud中的OpenFeign調(diào)用解讀

    SpringCloud中的OpenFeign調(diào)用解讀

    OpenFeign是一個顯示聲明式的WebService客戶端,使用OpenFeign能讓編寫Web Service客戶端更加簡單OpenFeign的設(shè)計宗旨式簡化Java Http客戶端的開發(fā),本文給大家介紹SpringCloud之OpenFeign調(diào)用解讀,感興趣的朋友一起看看吧
    2023-11-11
  • 解決Error:(5, 28) java: 程序包org.apache.ibatis.io不存在問題

    解決Error:(5, 28) java: 程序包org.apache.ibatis.io

    這篇文章主要介紹了解決Error:(5, 28) java: 程序包org.apache.ibatis.io不存在問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論