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

深入解析HashMap的put方法

 更新時間:2022年01月19日 16:50:24   作者:小寫丶H  
在Java集合中,HashMap的重要性不言而喻,作為一種存儲鍵值對的數(shù)據(jù)結構,它在日常開發(fā)中有著非常多的應用場景,也是面試中的高頻考點,本篇文章就來分析一下HashMap集合中的put方法

一.創(chuàng)建

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

二.put()

進入底層源碼看一下。

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

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

當一個數(shù)組元素下的鏈表長度超過8,就會觸發(fā)treeifyBin(),

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

此時就會紅黑樹收縮回鏈表了。

三.數(shù)組初始化

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

四.擴容

負載因子 = 添加的元素 / hash表的長度

這個值默認是 0.75 ( jdk1.8)(可以根據(jù)實際需求調整,當值越大hash沖突概率就高,查詢效率低,節(jié)省了空間,反之相反),當超過0.75,就會觸發(fā)resize(),進行數(shù)組的擴容。

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

相關文章

  • Spring Cloud中Eureka開啟密碼認證的實例

    Spring Cloud中Eureka開啟密碼認證的實例

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

    Spring Shell應用程序開發(fā)流程解析

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

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

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

    Java中的接口多繼承機制

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

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

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

    SpringCloud feign微服務調用之間的異常處理方式

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

    詳解spring mvc 請求轉發(fā)和重定向

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

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

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

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

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

    Java基礎之面向對象機制(多態(tài)、繼承)底層實現(xiàn)

    這篇文章主要介紹了Java基礎之面向對象機制(多態(tài)、繼承)底層實現(xiàn),文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論