国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試官:談一談你對HashMap的理解?

開發 后端
HashMap的原理也是大廠面試中經常會涉及的問題,同時也是工作中常用到的Java容器,本文主要通過對以下問題進行分析講解,來幫助大家理解HashMap的原理。

摘要

HashMap的原理也是大廠面試中經常會涉及的問題,同時也是工作中常用到的Java容器,本文主要通過對以下問題進行分析講解,來幫助大家理解HashMap的原理。

  • HashMap添加一個鍵值對的過程是怎么樣的?
  • 為什么說HashMap不是線程安全的?
  • 為什么要一起重寫hashCode()和equal()方法?

1、HashMap添加一個鍵值對的過程是怎么樣的?

這是網上找的一張流程圖,可以結合著步驟來看這個流程圖,了解添加鍵值對的過程。

 

面試官:談一談你對HashMap的理解?

1.初始化table

判斷table是否為空或為null,否則執行resize()方法(resize方法一般是擴容時調用,也可以調用來初始化table)。

2.計算hash值

根據鍵值key計算hash值。(因為hashCode是一個int類型的變量,是4字節,32位,所以這里會將hashCode的低16位與高16位進行一個異或運算,來保留高位的特征,以便于得到的hash值更加均勻分布)

 

面試官:談一談你對HashMap的理解?

3.插入或更新節點

根據(n - 1) & hash計算得到插入的數組下標i,然后進行判斷

table[i]==null

那么說明當前數組下標下,沒有hash沖突的元素,直接新建節點添加。

table[i].hash == hash &&(table[i]== key || (key != null && key.equals(table[i].key)))

判斷table[i]的首個元素是否和key一樣,如果相同直接更新value。

table[i] instanceof TreeNode

判斷table[i] 是否為treeNode,即table[i] 是否是紅黑樹,如果是紅黑樹,則直接在樹中插入鍵值對。

其他情況

上面的判斷條件都不滿足,說明table[i]存儲的是一個鏈表,那么遍歷鏈表,判斷是否存在已有元素的key與插入鍵值對的key相等,如果是,那么更新value,如果沒有,那么在鏈表末尾插入一個新節點。插入之后判斷鏈表長度是否大于8,大于8的話把鏈表轉換為紅黑樹。

4.擴容

插入成功后,判斷實際存在的鍵值對數量size是否超多了最大容量threshold(一般是數組長度*負載因子0.75),如果超過,進行擴容。

源代碼如下:

 

面試官:談一談你對HashMap的理解?

2.為什么說HashMap不是線程安全的?

其實通過學習HashMap添加鍵值對的方法,我們可以看到整個方法內都沒有使用到鎖,所以一旦多線并發訪問,就有可能造成數據不一致的問題,

例如:

如果有兩個添加鍵值對的線程都執行到if ((tab = table) == null || (n = tab.length) == 0)這行語句,都對table變量進行數組初始化,就會造成已經初始化好的數組table被覆蓋,然后前面初始化的線程會將鍵值對添加到之前初始化的數組中去,造成鍵值對丟失。

 

面試官:談一談你對HashMap的理解?

3.為什么要一起重寫hashCode()和equal()方法?

當我們的對象一旦作為HashMap中的key,或者是HashSet中的元素使用時,就必須同時重寫hashCode()和equal()方法

首先看看hashCode()和equal()方法的默認實現

可以看到Obejct類中的源碼如下,可以看到equals()方法的默認實現是判斷兩個對象的內存地址是否相同來決定返回結果。

 

面試官:談一談你對HashMap的理解?

網上很多博客說hashCode的默認實現是返回內存地址,其實不對,以OpenJDK為例,hashCode的默認計算方法有5種,有返回隨機數的,有返回內存地址,具體采用哪一種計算方法取決于運行時庫和JVM的具體實現。

感興趣的朋友可以看看這篇博客 blog.csdn.net/xusiwei1236…

然后看看hashCode()方法,equal()方法在HashMap中的應用

 

面試官:談一談你對HashMap的理解?

為了將一組鍵值對均勻得存儲在一個數組中,HashMap對key的hashCode進行計算得到一個hash值,用hash對數組長度取模,得到數組下標,將鍵值對存儲在數組下標對應的鏈表下(假設鏈表長度小于8,沒有達到轉換為紅黑樹的閥值)。

下面是添加鍵值對的putVal()方法,當數組下標對應的是一個鏈表時執行的代碼

 

面試官:談一談你對HashMap的理解?

可以清楚地看到判斷添加的key與鏈表中已存在的key是否相等的方法主要是e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))), 也就是: 1.先判斷hash值是否相等,不相等直接結束判斷,因為hash值不相等,key肯定不相等。 2.判斷兩個key對象的內存地址是否相等(相等指向內存中同一個對象)。 3.key不為null,調用key的equal()方法判斷是否相等,因為有可能兩個key在內存中存儲的地址不一樣,但是是相等的。 就像是

 

面試官:談一談你對HashMap的理解?

背景

假設我們有一個KeyObject類,假設我們認為兩個KeyObject的屬性a相等,那么KeyObject就是相等的相等的,我們將KeyObject作為HashMap的key,以KeyObject是否相等作為去重標準,不能重復添加KeyObject相等,value不等的值到HashMap中去

 

面試官:談一談你對HashMap的理解?

假設都hashCode()方法和equals()方法都不重寫(結果:HashMap無法保證去重)

執行以下代碼:

 

面試官:談一談你對HashMap的理解?

如果KeyObject的hashCode()方法和equals()方法都不重寫,那么即便KeyObject的屬性a都是1,key1和key2的hashCode都是不相同的,key1和key2調用equals()方法也不相等,這樣hashMap中就可以同時存在key1和key2了。

打印結果:

 

面試官:談一談你對HashMap的理解?

假如只重寫hashCode()方法(結果:無法正確地與鏈表元素進行相等判斷,從而無法保證去重)

執行以下代碼:

 

面試官:談一談你對HashMap的理解?

此時equal()方法的實現是默認實現,也就是當兩個對象的內存地址相等時,equal()方法才返回true,雖然key1和key2的a屬性是相同的,但是他們在內存中是不同的對象,所以key1==key2結果會是false,KeyObject的equals()方法默認實現是判斷兩個對象的內存地址,所以 key1.equals(key2)也會是false,所以這兩個鍵值對可以重復地添加到hashMap中去。

輸出結果:

 

面試官:談一談你對HashMap的理解?

假如只重寫equals()方法(結果:映射到HashMap中不同數組下標,無法保證去重)

 

面試官:談一談你對HashMap的理解?

假設只equals()方法,hashCode方法會是默認實現,具體的計算方法取決于JVM,(測試時發現是內存地址不同但是相等的對象,它們的hashCode不相同),所以計算得到的數組下標不相同,會存儲到hashMap中不同數組下標下的鏈表中,也會導致HashMap中存在重復元素。

輸出結果如下:

 

面試官:談一談你對HashMap的理解?

總結

所以當我們的對象一旦作為HashMap中的key,或者是HashSet中的元素使用時,就必須同時重寫hashCode()和equal()方法,因為hashCode會影響key存儲的數組下標及與鏈表元素的初步判斷,equal()是作為判斷key與鏈表中的key是否相等的最后標準。

所以只重寫hashCode()方法,會導致無法正確地與鏈表元素進行相等判斷,從而無法保證去重)

只重寫equals()方法導致鍵值對映射到HashMap中不同數組下標,無法保證去重

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2021-11-25 10:18:42

RESTfulJava互聯網

2025-01-13 09:24:32

2021-08-09 07:47:40

Git面試版本

2024-09-27 15:43:52

零拷貝DMAIO

2020-12-01 08:47:36

Java異常開發

2025-02-21 15:25:54

虛擬線程輕量級

2020-06-12 15:50:56

options前端服務器

2025-03-21 00:00:05

Reactor設計模式I/O 機制

2022-03-21 09:05:18

volatileCPUJava

2024-10-24 16:14:43

數據傳輸CPU零拷貝

2025-08-18 00:00:00

零拷貝系統調用函數

2021-05-11 08:48:23

React Hooks前端

2024-08-27 12:36:33

2024-06-13 08:01:19

2024-10-12 16:25:12

2019-07-26 06:42:28

PG架構數據庫

2024-08-26 14:52:58

JavaScript循環機制

2024-09-26 16:01:52

2021-09-16 07:52:18

算法應用場景

2019-05-10 10:50:04

Spring AOPJDK動態代理CGLIB動態代理
點贊
收藏

51CTO技術棧公眾號

久久亚洲欧美| 亚洲精品videosex极品| 欧美裸身视频免费观看| 国产成人一二| 在线欧美亚洲| 18禁男女爽爽爽午夜网站免费| 亚洲伊人精品酒店| 精品久久不卡| 久久免费视频在线观看| 欧美天堂视频| 日韩欧美区一区二| 欧美18一19xxx性| 欧美三区在线观看| 国产免费av在线| 欧美日韩国产中字| 22288色视频在线观看| 亚洲精品中文在线影院| 我要看一级黄色大片| 久久精品亚洲国产奇米99| 国产午夜福利视频在线观看| 91污片在线观看| 人人爽人人av| 自拍偷自拍亚洲精品播放| 久久国产情侣| 欧美日韩免费一区| av在线之家电影网站| 欧美一区二区福利在线| 青青草原国产在线| 亚洲人成在线电影| 美女久久精品| 国产精品极品美女在线观看免费| 国产亚洲电影| 韩国精品一区二区三区六区色诱| 精品三区视频| 欧美日韩久久久| 国产午夜精品一区理论片| 欧美第一精品| 国产激情视频一区| 色av成人天堂桃色av| 菠萝菠萝蜜在线视频免费观看| av资源网一区| 精品日本一区二区三区| 欧美福利在线播放网址导航| 亚洲成人性视频| 不卡av影片| 日韩视频免费大全中文字幕| 日本中文字幕在线视频观看| 欧美成人国产va精品日本一级| 日韩在线激情视频| 在线视频自拍| 91精品国产91久久久久久一区二区 | 一级日韩一区在线观看| 国产在线视频一区二区| 国产亚洲黄色片| 中文字幕制服丝袜一区二区三区| 91天堂在线| 91精品久久久久久蜜臀| 精品三区视频| 国产欧美一区二区三区久久人妖| 亚洲福利一区| 国产精品videossex国产高清| 91麻豆swag| 在线黄色av| 亚洲国产91色在线| 国产一区二区三区亚洲| 9a蜜桃久久久久久免费| 久久av老司机精品网站导航| 成人嫩草影院免费观看| 在线91免费看| 亚洲视频精选| 欧美精品亚洲精品| 国产欧美视频在线观看| 999国产在线视频| 久久久国产一区二区| 影视一区二区| 成熟丰满熟妇高潮xxxxx视频| 欧美体内谢she精2性欧美| 亚洲精品大片| 日韩欧美一区二区三区四区| 亚洲一区二区三区三| 国产美女高潮在线观看| 国产日产久久高清欧美一区| 国产成人免费视频网站| 成人在线观看免费| 97热在线精品视频在线观看| 久久99最新地址| 超碰免费在线| 国产成人一区二| 久久一二三国产| 激情aⅴ欧美一区二区欲海潮| 91午夜在线播放| 国产精品视频分类| 欧美日韩成人综合在线一区二区| 亚洲午夜剧场| 美国一级片在线免费观看视频 | 操欧美老女人| 搞黄视频在线观看| 美女主播视频一区| 欧美成人剧情片在线观看| 精品久久在线播放| 首页国产精品| 免费久久一级欧美特大黄| 97se狠狠狠综合亚洲狠狠| 亚洲综合色视频在线观看| 精品久久99ma| 色狮一区二区三区四区视频| 国模一区二区三区私拍视频| 国内精品福利| 91免费国产精品| 国产电影一区在线| 一级片在线免费看| 激情不卡一区二区三区视频在线| 国语自产精品视频在免费| 国语产色综合| 国产乱xxⅹxx国语对白| 日韩一区二区中文字幕| 成人性生交大片免费看中文视频| 羞羞色国产精品| 国内久久精品视频| 日韩在线一级片| 日韩一区二区三区免费看 | 爱啪视频在线观看视频免费| 午夜精品福利在线观看| 久久久久久久久久久99999| 日本在线免费| 麻豆亚洲一区| 亚洲精品wwwww| 欧美黄免费看| 欧美日韩激情视频一区二区三区| 日韩免费av一区二区三区| 激情懂色av一区av二区av| 欧美久久久久久久久久久久久久| 日韩精品在线私人| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲一二三四| 三级在线免费观看| 久久人人爽人人| 99porn视频在线| 国产极品精品在线观看| 91精品视频在线看| 欧美性视频精品| 久久国产加勒比精品无码| 在线精品视频免费播放| 日本一区二区免费在线| hitomi一区二区三区精品| 欧美久久一级| 18国产精品| 成人在线中文| 日韩欧美xxxx| 亚洲一区二区少妇| 一区二区在线视频播放| 岛国av午夜精品| 国产精品不卡一区二区三区| 免费的成人av| 成人va天堂| 日本精品在线| 日韩人妻精品无码一区二区三区| 国产成人亚洲综合| 日韩一区二区免费高清| 中文一区一区三区高中清不卡| 亚洲人成人一区二区三区| 欧美videos粗暴| 黄色片av在线| 成人亚洲在线观看| 国产剧情av在线| 国产亚洲欧美另类一区二区三区| 久久99热这里只有精品国产 | 美女日韩在线中文字幕| 欧美大片免费| 中文字幕在线视频区| 先锋影音一区二区三区| 57pao成人永久免费视频| 91精品国产综合久久久久久久久久 | 窝窝九色成人影院| 国产精品69久久| 在线一区二区三区四区五区 | 视频一区视频二区国产精品| 99re免费视频精品全部| 奇米狠狠一区二区三区| 免费a级毛片在线播放| 国产a级黄色大片| 日韩美女免费线视频| 欧美成人欧美edvon| 久久精品一区八戒影视| 欧美精品国产一区| 欧美a一级片| 成年人在线观看| 久久久久狠狠高潮亚洲精品| 国产91社区| 欧美xxxx做受欧美.88| 欧美视频第二页| 91看片淫黄大片一级在线观看| 影视亚洲一区二区三区| 综合欧美精品| 在线日本中文字幕| 色婷婷综合网站| 日韩电影大全在线观看| 国产不卡av在线| 欧美成人精精品一区二区频| 亚洲欧美欧美一区二区三区|