大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 編程基礎(chǔ)入門(mén)分享,Java hashmap的用法

編程基礎(chǔ)入門(mén)分享,Java hashmap的用法

更新時(shí)間:2020-05-20 15:57:32 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2829次

1.HashMap基礎(chǔ)

基本定義:根據(jù)源代碼的描述可知,HashMap是基于哈希表的Map接口的實(shí)現(xiàn),其包含了Map接口的所有映射操作,并且允許使用null鍵和null值。

與HashTable的區(qū)別:HashMap可以近似地看成是HashTable,但是它是非線程安全的,并且允許使用null鍵和null值,而這些都與HashTable恰巧相反。

注:HashMap可以使用ConcurrentHashMap代替,ConcurrentHashMap是一個(gè)線程安全,更加快速的HashMap。

存儲(chǔ)結(jié)構(gòu):HashMap的存儲(chǔ)結(jié)構(gòu)其實(shí)就是哈希表的存儲(chǔ)結(jié)構(gòu)(由數(shù)組與鏈表結(jié)合組成,稱為鏈表的數(shù)組)。如下圖所示:

編程基礎(chǔ)入門(mén)分享,Java hashmap的用法

HashMap的主干是一個(gè)Entry數(shù)組。Entry是HashMap的基本組成單元,每一個(gè)Entry包含一個(gè)key-value鍵值對(duì)。

如上圖所示,HashMap中元素存儲(chǔ)的形式是鍵-值對(duì)(key-value對(duì),即Entry對(duì)),所有具有相同hashcode值的鍵(key)所對(duì)應(yīng)的entry對(duì)會(huì)被鏈接起來(lái)組成一條鏈表,而數(shù)組的作用則是存儲(chǔ)鏈表中第一個(gè)結(jié)點(diǎn)的地址值。

2.影響HashMap性能的因素

在HashMap中,還存在著兩個(gè)概念,桶(buckets)和加載因子(loadfactor)。

桶(buckets):上圖中的標(biāo)有0、1、2、3、….、11所對(duì)應(yīng)的數(shù)組空間就是一個(gè)個(gè)桶。

加載因子(loadfactor):是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度,默認(rèn)值是0.75。

根據(jù)源代碼中所述,影響HashMap性能有兩個(gè)因素:哈希表中的初始化容量(桶的數(shù)量)和加載因子。當(dāng)哈希表中條目數(shù)超過(guò)了當(dāng)前容量與加載因子的乘積時(shí),哈希表將會(huì)作出自我調(diào)整,將容量擴(kuò)充為原來(lái)的兩倍,并且重新將原有的元素重新映射到表中,這一過(guò)程成為rehash。看到這里,相必大家會(huì)發(fā)現(xiàn)rehash操作是會(huì)造成時(shí)間與空間的開(kāi)銷(xiāo)的,因此為什么初始化容量與加載因子會(huì)影響HashMap的性能也就可以理解了。

3.put/get方法實(shí)現(xiàn)原理

put操作:HashMap在進(jìn)行put操作的時(shí)候,會(huì)首先調(diào)用Key值中的hashCode()方法,用于獲取對(duì)應(yīng)的bucket的下標(biāo)值以便存放數(shù)據(jù)。

HashMap通過(guò)key值的hashCode獲得了對(duì)應(yīng)的bucket存儲(chǔ)空間的下標(biāo),然后進(jìn)入bucket空間,通過(guò)鏈表遍歷的方式逐個(gè)查詢,看看鏈表中是否已經(jīng)存在了這個(gè)key的鍵-值對(duì),如果已經(jīng)存在則用新值替換舊值,否則插入新的鍵-值對(duì)。

看到這里,相信大家會(huì)發(fā)現(xiàn),hashCode值相同的兩個(gè)值可能是不同的兩個(gè)對(duì)象,而當(dāng)put進(jìn)去的是另一個(gè)hashCode值相等的對(duì)象時(shí),會(huì)發(fā)生沖突,而在HashMap中解決這種沖突的方法就是將hashCode值相同的key值所對(duì)應(yīng)的key-value對(duì)串聯(lián)成一條鏈表,請(qǐng)見(jiàn)上面的HashMap數(shù)據(jù)結(jié)構(gòu)圖。

get操作:HashMap在進(jìn)行g(shù)et操作的時(shí)候,與put方法類(lèi)似,會(huì)首先調(diào)用Key值中的hashCode()方法,用于獲取對(duì)應(yīng)的bucket的下標(biāo)值,找到bucket的位置后,再通過(guò)key.equals()方法找到對(duì)應(yīng)的鍵-值對(duì),從而獲得對(duì)應(yīng)的value值。

總結(jié)

HashMap是基于hashing原理對(duì)key-value對(duì)進(jìn)行存儲(chǔ)與獲取,當(dāng)使用put()方法添加key-value對(duì)時(shí),它會(huì)首先檢查hashCode的值,并以此獲得對(duì)應(yīng)的bucket位置進(jìn)行存儲(chǔ),當(dāng)發(fā)生沖突時(shí)(hashCode值相同的兩個(gè)不同key),新的key-value對(duì)會(huì)以結(jié)點(diǎn)的形式添加到鏈表的末尾(先看看鏈表中是否已經(jīng)存在了這個(gè)key,如果已經(jīng)存在,則更新;否則就添加到鏈表的末尾)。而使用get()方法時(shí),同樣地會(huì)根據(jù)key的hashCode值找到相應(yīng)的bucket位置,再通過(guò)key.equals()方法找到對(duì)應(yīng)的key-value對(duì),最終成功獲取value值。

編程基礎(chǔ)入門(mén)分享,Java hashmap的用法

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“編程基礎(chǔ)入門(mén)分享,Java hashmap的用法”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-04-24 搶座中
  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 色婷婷久久综合中文网站 | 高级毛片 | 老司机午夜免费视频 | 成年人福利网站 | 久久精品国产免费看久久精品 | 美女精品久久久久久国产潘金莲 | 久久的爱久久久久的快乐 | 久久在线| 亚洲人成免费网站 | 夜夜操夜夜 | 国产亚洲日本人在线观看 | 九九网站 | 久久久久九九精品影院 | 思思久热re6这里有精品 | 亚洲久久视频 | 色多网站免费视频 | 欧美一及 | 激情国产白嫩美女在线观看 | 国产毛片久久国产 | 亚洲成在人网站天堂一区二区 | 亚洲欧美日韩一区二区在线观看 | 狠狠操狠狠插 | 天天摸天天操 | 日日网站| 成人国产欧美精品一区二区 | 国产精品亚洲一区二区在线观看 | 黄视频在线观看www 黄视频在线观看网站 | 久久99精品久久久久久国产越南 | 奇米网在线视频 | 日本一区二区三区在线播放 | 日韩精品123 | 伊人久久综合热青草 | 久久精品网站免费观看调教 | 视频精品一区二区三区 | 日本人一级毛片免费视频 | 亚洲一级成人 | 91九色视频无限观看免费 | 久久精品五月天 | a毛片全部免费播放 | 久久er99热精品一区二区 | 天天插天天干天天操 |