最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年11月22日 17:29:47   作者:肝鐵俠  
Hashmap是java面試中經(jīng)常遇到的面試題,大部分都會問其底層原理與實(shí)現(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é)點(diǎn)是不是就是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的手動實(shí)現(xiàn)。

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

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

在JDK1.7中是通過數(shù)組+鏈表實(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ù),都得維護(hù)紅黑樹的結(jié)構(gòu),復(fù)雜度為O(log n)。其實(shí)算是對查找和插入元素時性能的一個權(quán)衡,畢竟存入的效果就是用來查詢的。

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

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

相關(guān)文章

  • springboot接受前端請求的方法實(shí)現(xiàn)

    springboot接受前端請求的方法實(shí)現(xiàn)

    本文主要介紹了springboot接受前端請求的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • SpringBoot實(shí)現(xiàn)api加密的示例代碼

    SpringBoot實(shí)現(xiàn)api加密的示例代碼

    在項(xiàng)目中,為了保證數(shù)據(jù)的安全,我們常常會對傳遞的數(shù)據(jù)進(jìn)行加密。本文主要介紹了SpringBoot實(shí)現(xiàn)api加密的示例代碼,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java異常類型介紹及處理方法

    Java異常類型介紹及處理方法

    這篇文章介紹了Java異常類型介紹及處理方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • java爬取并下載酷狗TOP500歌曲的方法

    java爬取并下載酷狗TOP500歌曲的方法

    這篇文章主要介紹了java爬取并下載酷狗TOP500歌曲的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01
  • Mybatis傳list參數(shù)調(diào)用oracle存儲過程的解決方法

    Mybatis傳list參數(shù)調(diào)用oracle存儲過程的解決方法

    怎么利用MyBatis傳List類型參數(shù)到數(shù)據(jù)庫存儲過程中實(shí)現(xiàn)批量插入數(shù)據(jù)?接下來通過本文給大家介紹Mybatis傳list參數(shù)調(diào)用oracle存儲過程,需要的朋友可以參考下
    2017-03-03
  • springboot jasypt2.x與jasypt3.x的使用方式

    springboot jasypt2.x與jasypt3.x的使用方式

    在軟件開發(fā)中,將配置文件中的敏感信息(如數(shù)據(jù)庫密碼)進(jìn)行加密是保障安全的有效手段,jasypt框架提供了這一功能,支持通過加密工具類或命令行工具生成密文,并通過修改配置文件和啟動參數(shù)的方式使用密文和密鑰,這樣即便配置文件被泄露
    2024-09-09
  • 16進(jìn)制顯示字節(jié)流技巧分享

    16進(jìn)制顯示字節(jié)流技巧分享

    這篇文章主要介紹了16進(jìn)制顯示字節(jié)流的技巧分享,需要的朋友可以參考下
    2014-02-02
  • Spring中實(shí)例化bean的四種方式詳解

    Spring中實(shí)例化bean的四種方式詳解

    這篇文章主要給大家介紹了關(guān)于Spring中實(shí)例化bean的四種方式,分別是setter 方法、構(gòu)造函數(shù)、靜態(tài)工廠以及實(shí)例工廠等四種方法,分別給出了示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • SpringBoot中使用Redis對接口進(jìn)行限流的實(shí)現(xiàn)

    SpringBoot中使用Redis對接口進(jìn)行限流的實(shí)現(xiàn)

    本文將結(jié)合實(shí)例代碼,介紹SpringBoot中使用Redis對接口進(jìn)行限流的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java編程接口詳細(xì)

    Java編程接口詳細(xì)

    這篇文章主要小編主要給大家講解的是Java編程中的接口,文章會從抽象類和抽象方法開始展開內(nèi)容,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-10-10

最新評論

东港市| 丁青县| 灵宝市| 抚松县| 元谋县| 库车县| 龙江县| 古丈县| 昌黎县| 城步| 马鞍山市| 那曲县| 深水埗区| 盐城市| 临安市| 东乡县| 樟树市| 安丘市| 灌云县| 当雄县| 仁布县| 四川省| 迭部县| 晴隆县| 隆昌县| 七台河市| 吉林省| 东阿县| 清徐县| 赞皇县| 沧州市| 黄陵县| 博罗县| 万盛区| 嘉峪关市| 靖安县| 错那县| 安新县| 大洼县| 武汉市| 当雄县|