欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析HashMap的put方法

 更新時(shí)間:2022年01月19日 16:50:24   作者:小寫(xiě)丶H  
在Java集合中,HashMap的重要性不言而喻,作為一種存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),它在日常開(kāi)發(fā)中有著非常多的應(yīng)用場(chǎng)景,也是面試中的高頻考點(diǎn),本篇文章就來(lái)分析一下HashMap集合中的put方法

一.創(chuàng)建

這個(gè)相信大家也都知道怎么使用。今天就深入理解一下這里的底層原理。 首先HashMap在java中,創(chuàng)建出來(lái)是一個(gè)數(shù)組,然后數(shù)組上存放的元素是一個(gè)鏈表。

二.put()

進(jìn)入底層源碼看一下。

HashMap,在添加第一個(gè)元素的時(shí)候創(chuàng)建一個(gè)默認(rèn)2的冪的數(shù)組。也就是16,這個(gè)參數(shù)也可以你自己設(shè)置。但是一定是2的冪,假如new HashMap(30),那么只會(huì)創(chuàng)建一個(gè)32大小的數(shù)組。

計(jì)算出元素的hashcode,放到指定位置,看數(shù)組中是否有元素,無(wú)元素直接放到數(shù)組元素上,有元素的話則進(jìn)行(jdk1.8)尾插。

當(dāng)一個(gè)數(shù)組元素下的鏈表長(zhǎng)度超過(guò)8,就會(huì)觸發(fā)treeifyBin(),

但是必須滿(mǎn)足,數(shù)組的長(zhǎng)度大于64,否則,只是就行resize()擴(kuò)容,重新hash。 如果滿(mǎn)足鏈表長(zhǎng)度大于8,并且數(shù)組長(zhǎng)度大于64,此時(shí)就把鏈表轉(zhuǎn)換成紅黑樹(shù)(一種比較平衡的二叉搜索樹(shù))。 著里再講一個(gè)設(shè)計(jì)remove()刪除元素,當(dāng)紅黑樹(shù)里的元素被刪除到小于8的時(shí)候怎么辦?其實(shí)這里有個(gè)過(guò)渡,不是8,而是如果紅黑樹(shù)里的元素刪除的小于6的時(shí)候就會(huì)觸發(fā)收縮檢測(cè)。

此時(shí)就會(huì)紅黑樹(shù)收縮回鏈表了。

三.數(shù)組初始化

前面 put里提到過(guò),初始new HashMap() 默認(rèn)大小是16,可以指定數(shù)組大小,但是一定是2的冪。如 new HashMap(30),那么數(shù)組的大小就為32了。這個(gè)都很好理解。

四.擴(kuò)容

負(fù)載因子 = 添加的元素 / hash表的長(zhǎng)度

這個(gè)值默認(rèn)是 0.75 ( jdk1.8)(可以根據(jù)實(shí)際需求調(diào)整,當(dāng)值越大hash沖突概率就高,查詢(xún)效率低,節(jié)省了空間,反之相反),當(dāng)超過(guò)0.75,就會(huì)觸發(fā)resize(),進(jìn)行數(shù)組的擴(kuò)容。

到此這篇關(guān)于深入解析HashMap的put方法的文章就介紹到這了,更多相關(guān)HashMap put方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud中Eureka開(kāi)啟密碼認(rèn)證的實(shí)例

    Spring Cloud中Eureka開(kāi)啟密碼認(rèn)證的實(shí)例

    這篇文章主要介紹了Spring Cloud中Eureka開(kāi)啟密碼認(rèn)證的實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Spring Shell應(yīng)用程序開(kāi)發(fā)流程解析

    Spring Shell應(yīng)用程序開(kāi)發(fā)流程解析

    這篇文章主要介紹了Spring Shell應(yīng)用程序開(kāi)發(fā)流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot Session共享實(shí)現(xiàn)圖解

    SpringBoot Session共享實(shí)現(xiàn)圖解

    這篇文章主要介紹了SpringBoot Session共享實(shí)現(xiàn)圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java中的接口多繼承機(jī)制

    Java中的接口多繼承機(jī)制

    大家好,本篇文章主要講的是Java中的接口多繼承機(jī)制,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • JAVA實(shí)現(xiàn)線程的三種方法

    JAVA實(shí)現(xiàn)線程的三種方法

    這篇文章介紹了JAVA實(shí)現(xiàn)線程的三種方法,有需要的朋友可以參考一下
    2013-09-09
  • SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式

    SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式

    這篇文章主要介紹了SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解spring mvc 請(qǐng)求轉(zhuǎn)發(fā)和重定向

    詳解spring mvc 請(qǐng)求轉(zhuǎn)發(fā)和重定向

    這篇文章主要介紹了詳解spring mvc 請(qǐng)求轉(zhuǎn)發(fā)和重定向,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • java線程間通信的通俗解釋及代碼示例

    java線程間通信的通俗解釋及代碼示例

    這篇文章主要介紹了java線程間通信的通俗解釋?zhuān)榻B了線程通信中的幾個(gè)相關(guān)概念,然后分享了線程通信的實(shí)現(xiàn)方式及代碼示例,具有一定參考價(jià)值 ,需要的朋友可以了解下。
    2017-11-11
  • redis setIfAbsent和setnx的區(qū)別與使用說(shuō)明

    redis setIfAbsent和setnx的區(qū)別與使用說(shuō)明

    這篇文章主要介紹了redis setIfAbsent和setnx的區(qū)別與使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)

    Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)

    這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論