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

JAVA進(jìn)階之HashMap底層實現(xiàn)解析

 更新時間:2021年11月22日 17:29:47   作者:肝鐵俠  
Hashmap是java面試中經(jīng)常遇到的面試題,大部分都會問其底層原理與實現(xiàn),為了能夠溫故而知新,特地寫了這篇文章,以便時時學(xué)習(xí)

首先我們來通過下面的圖看看JDK1.7時代的HashMap是如何通過數(shù)組+鏈表的形式進(jìn)行值儲存的。

由圖中的描述可以清楚地看出來,當(dāng)數(shù)組第一次被定義并且第一次被賦值的時候,這個時候的操作很簡單,就是將這個值賦值到我們的table數(shù)組上面去。這個操作完成以后,然后我們進(jìn)行二次put:

如圖左下角描述所示的情況,當(dāng)數(shù)組table下標(biāo)出現(xiàn)了相等的情況的時候,此時此刻還是將肝鐵俠2的值賦值給tablle[i]的,這里講述的是JDK1.7版本下HashMap中插入的頭插法,而JDK1.8版本中是用的尾插法。插入以后,我們要讓數(shù)組指向鏈表的頭部,那么鏈表的頭部也就是頭節(jié)點是不是就是table[i]的位置呀。

如上,最終插入完成以后的模型就是這樣的:

那我們此時此刻是不是就可以大膽地猜測,在HashMap中,使用map.get(“name”)獲取到它的value的時候,是不是就是通過int hash = “name”.hashcode,然后獲取到對應(yīng)table下的數(shù)組下標(biāo)int i = hash % table.length獲取到table[i]的具體位置的鏈表,然后再通過hash去對應(yīng)table[i]上的鏈表中找到對應(yīng)的值呢?

有了這個思維,我們再去看HashMap的源碼就會輕松許多許多。下一期為大家?guī)鞨ashMap的手動實現(xiàn)。

再順帶兩個基本的關(guān)于HashMap的問題:

HashMap底層是怎么實現(xiàn)的呢?

在JDK1.7中是通過數(shù)組+鏈表實現(xiàn)的。JDK1.8中是通過數(shù)組+鏈表+樹(紅黑樹)組成的。

為什么要用鏈表呢?

①HashMap數(shù)組元素為鏈表的時候,插入直接使用頭插,插入復(fù)雜度O(1),即操作的數(shù)量為常數(shù),與輸入的數(shù)據(jù)的規(guī)模無關(guān),效率是非??斓?;當(dāng)鏈表較短時候,查找數(shù)據(jù)時對性能并沒有什么影響,但是如果鏈表一長,查找起來就很影響性能了。

②在Java8中,如果鏈表長度到達(dá)了8個,就會轉(zhuǎn)化為紅黑樹,提高了查找的性能,但每次插入新的數(shù)據(jù),都得維護紅黑樹的結(jié)構(gòu),復(fù)雜度為O(log n)。其實算是對查找和插入元素時性能的一個權(quán)衡,畢竟存入的效果就是用來查詢的。

這個問題的答案不唯一,可以自行了解一下。

以上就是JAVA進(jìn)階之HashMap底層實現(xiàn)解析的詳細(xì)內(nèi)容,更多關(guān)于HashMap底層實現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • jpa異常No entity found for query問題解決

    jpa異常No entity found for query問題解決

    這篇文章主要為大家介紹了jpa異常之No entity found for query的異常問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算

    Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算

    這篇文章主要介紹了Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算,本文通過實例代碼給大家介紹的非常想詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • SpringBoot ApplicationListener事件監(jiān)聽接口使用問題探究

    SpringBoot ApplicationListener事件監(jiān)聽接口使用問題探究

    這篇文章主要介紹了SpringBoot ApplicationListener事件監(jiān)聽接口使用問題,自定義監(jiān)聽器需要實現(xiàn)ApplicationListener接口,實現(xiàn)對應(yīng)的方法來完成自己的業(yè)務(wù)邏輯。SpringBoot Application共支持6種事件監(jiān)聽
    2023-04-04
  • SpringMVC存取Session的兩種方法

    SpringMVC存取Session的兩種方法

    Spring MVC是個非常優(yōu)秀的框架,本篇文章主要介紹了SpringMVC存取Session的兩種方法,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Java多線程事務(wù)回滾@Transactional失效處理方案

    Java多線程事務(wù)回滾@Transactional失效處理方案

    這篇文章主要介紹了Java多線程事務(wù)回滾@Transactional失效處理方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • SpringBoot+Quartz實現(xiàn)動態(tài)定時任務(wù)

    SpringBoot+Quartz實現(xiàn)動態(tài)定時任務(wù)

    這篇文章主要為大家詳細(xì)介紹了springBoot+Quartz實現(xiàn)動態(tài)定時任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Spring Boot使用FastJson解析JSON數(shù)據(jù)的方法

    Spring Boot使用FastJson解析JSON數(shù)據(jù)的方法

    本篇文章主要介紹了Spring Boot使用FastJson解析JSON數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • java的繼承原理與實現(xiàn)方法詳解

    java的繼承原理與實現(xiàn)方法詳解

    這篇文章主要介紹了java的繼承原理與實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了Java繼承的概念、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-05-05
  • 詳解Java的按位操作符

    詳解Java的按位操作符

    Java的位操作符用來操作整數(shù)基本數(shù)據(jù)類型中的單個“比特”(bit),即代進(jìn)制位。下面通過本文給大家分享Java的按位操作符,感興趣的朋友一起看看吧
    2017-09-09
  • SpringBoot實現(xiàn)統(tǒng)一功能處理的教程詳解

    SpringBoot實現(xiàn)統(tǒng)一功能處理的教程詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實現(xiàn)統(tǒng)一功能處理,文中的示例代碼講解詳細(xì),對大家學(xué)習(xí)或工作有一定借鑒價值,感興趣的同學(xué)可以參考閱讀下
    2023-05-05

最新評論