亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

HashMap原理詳講

2019-11-10 20:12:02
字體:
供稿:網(wǎng)友

HashMap詳講

HashMap詳講hashing散列法或哈希法的概念什么是HashMap以及HashMap的構(gòu)成HashMap的基本存儲(chǔ)原理以及存儲(chǔ)內(nèi)容的組成HashMap的工作原理以及存取方法過程HashMap中的碰撞探測(cè)collision detection以及碰撞的解決方法如何重新調(diào)整HashMap的大小不可變對(duì)象的好處HashMap多線程的條件競(jìng)爭(zhēng)

下面就根據(jù)這些問題講解一下HashMap

hashing(散列法或哈希法)的概念

可以自行百度

什么是HashMap以及HashMap的構(gòu)成

HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵。HashMap儲(chǔ)存的是鍵值對(duì),HashMap很快。此類不保證映射的順序,特別是它不保證該順序恒久不變。

HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。

數(shù)組:存儲(chǔ)區(qū)間連續(xù),占用內(nèi)存嚴(yán)重,尋址容易,插入刪除困難; 鏈表:存儲(chǔ)區(qū)間離散,占用內(nèi)存比較寬松,尋址困難,插入刪除容易; Hashmap綜合應(yīng)用了這兩種數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了尋址容易,插入刪除也容易。

hashMap的結(jié)構(gòu)示意圖如下: 這里寫圖片描述

HashMap的基本存儲(chǔ)原理以及存儲(chǔ)內(nèi)容的組成

基本原理:先聲明一個(gè)下標(biāo)范圍比較大的數(shù)組來存儲(chǔ)元素。另外設(shè)計(jì)一個(gè)哈希函數(shù)(也叫做散列函數(shù))來獲得每一個(gè)元素的Key(關(guān)鍵字)的函數(shù)值(即數(shù)組下標(biāo),hash值)相對(duì)應(yīng),數(shù)組存儲(chǔ)的元素是一個(gè)Entry類,這個(gè)類有三個(gè)數(shù)據(jù)域,key、value(鍵值對(duì)),next(指向下一個(gè)Entry)。 例如, 第一個(gè)鍵值對(duì)A進(jìn)來。通過計(jì)算其key的hash得到的index=0。記做:Entry[0] = A。 第二個(gè)鍵值對(duì)B,通過計(jì)算其index也等于0, HashMap會(huì)將B.next =A,Entry[0] =B, 第三個(gè)鍵值對(duì) C,index也等于0,那么C.next = B,Entry[0] = C;這樣我們發(fā)現(xiàn)index=0的地方事實(shí)上存取了A,B,C三個(gè)鍵值對(duì),它們通過next這個(gè)屬性鏈接在一起。我們可以將這個(gè)地方稱為桶。 對(duì)于不同的元素,可能計(jì)算出了相同的函數(shù)值,這樣就產(chǎn)生了“沖突”,這就需要解決沖突,“直接定址”與“解決沖突”是哈希表的兩大特點(diǎn)。

HashMap的工作原理以及存取方法過程

HashMap的工作原理 :HashMap是基于散列法(又稱哈希法hashing)的原理,使用put(key, value)存儲(chǔ)對(duì)象到HashMap中,使用get(key)從HashMap中獲取對(duì)象。當(dāng)我們給put()方法傳遞鍵和值時(shí),我們先對(duì)鍵調(diào)用hashCode()方法,返回的hashCode用于找到bucket(桶)位置來儲(chǔ)存Entry對(duì)象?!盚ashMap是在bucket中儲(chǔ)存鍵對(duì)象和值對(duì)象,作為Map.Entry。并不是僅僅只在bucket中存儲(chǔ)值。

HashMap具體的存取過程如下: put鍵值對(duì)的方法的過程是: 1、獲取key ; 2、通過hash函數(shù)得到hash值; int hash=key.hashCode(); //獲取key的hashCode,這個(gè)值是一個(gè)固定的int值

3、得到桶號(hào)(一般都為hash值對(duì)桶數(shù)求模) ,也即數(shù)組下標(biāo)int index=hash%Entry[].length。//獲取數(shù)組下標(biāo):key的hash值對(duì)Entry數(shù)組長(zhǎng)度進(jìn)行取余

4、 存放key和value在桶內(nèi)。 table[index]=Entry對(duì)象;

get值方法的過程是: 1、獲取key 2、通過hash函數(shù)得到hash值 int hash=key.hashCode();

3、得到桶號(hào)(一般都為hash值對(duì)桶數(shù)求模) int index =hash%Entry[].length;

4、比較桶的內(nèi)部元素是否與key相等,若都不相等,則沒有找到。

5、取出相等的記錄的value。

HashMap中直接地址用hash函數(shù)生成;解決沖突,用比較函數(shù)解決。如果每個(gè)桶內(nèi)部只有一個(gè)元素,那么查找的時(shí)候只有一次比較。當(dāng)許多桶內(nèi)沒有值時(shí),許多查詢就會(huì)更快了(指查不到的時(shí)候)。

HashMap中的碰撞探測(cè)(collision detection)以及碰撞的解決方法

當(dāng)兩個(gè)對(duì)象的hashcode相同時(shí),它們的bucket位置相同,‘碰撞’會(huì)發(fā)生。因?yàn)镠ashMap使用LinkedList存儲(chǔ)對(duì)象,這個(gè)Entry(包含有鍵值對(duì)的Map.Entry對(duì)象)會(huì)存儲(chǔ)在LinkedList中。這兩個(gè)對(duì)象就算hashcode相同,但是它們可能并不相等。 那如何獲取這兩個(gè)對(duì)象的值呢?當(dāng)我們調(diào)用get()方法,HashMap會(huì)使用鍵對(duì)象的hashcode找到bucket位置,遍歷LinkedList直到找到值對(duì)象。找到bucket位置之后,會(huì)調(diào)用keys.equals()方法去找到LinkedList中正確的節(jié)點(diǎn),最終找到要找的值對(duì)象使用不可變的、聲明作final的對(duì)象,并且采用合適的equals()和hashCode()方法的話,將會(huì)減少碰撞的發(fā)生,提高效率。不可變性使得能夠緩存不同鍵的hashcode,這將提高整個(gè)獲取對(duì)象的速度,使用String,Interger這樣的wrapper類作為鍵是非常好的選擇。

如何重新調(diào)整HashMap的大小

“如果HashMap的大小超過了負(fù)載因子(load factor)定義的容量,怎么辦?” 默認(rèn)的負(fù)載因子大小為0.75,也就是說,當(dāng)一個(gè)map填滿了75%的bucket時(shí)候,和其它集合類(如ArrayList等)一樣,將會(huì)創(chuàng)建原來HashMap大小的兩倍的bucket數(shù)組,來重新調(diào)整map的大小,并將原來的對(duì)象放入新的bucket數(shù)組中。這個(gè)過程叫作rehashing,因?yàn)樗{(diào)用hash方法找到新的bucket位置。

不可變對(duì)象的好處

上面說到使用包裝類時(shí)刻作為鍵的原因是 String, Interger這樣的wrapper類作為HashMap的鍵是很合適的,而且String最為常用。因?yàn)镾tring是不可變的,也是final的,而且已經(jīng)重寫了equals()和hashCode()方法了。其他的wrapper類也有這個(gè)特點(diǎn)。不可變性是必要的,因?yàn)闉榱艘?jì)算hashCode(),就要防止鍵值改變,如果鍵值在放入時(shí)和獲取時(shí)返回不同的hashcode的話,那么就不能從HashMap中找到你想要的對(duì)象。不可變性還有其他的優(yōu)點(diǎn)如線程安全。如果你可以僅僅通過將某個(gè)field聲明成final就能保證hashCode是不變的,那么請(qǐng)這么做吧。因?yàn)楂@取對(duì)象的時(shí)候要用到equals()和hashCode()方法,那么鍵對(duì)象正確的重寫這兩個(gè)方法是非常重要的。如果兩個(gè)不相等的對(duì)象返回不同的hashcode的話,那么碰撞的幾率就會(huì)小些,這樣就能提高HashMap的性能。

HashMap多線程的條件競(jìng)爭(zhēng)

重新調(diào)整HashMap大小存在什么問題嗎?”在多線程的情況下,可能產(chǎn)生條件競(jìng)爭(zhēng)(race condition)。因?yàn)槿绻麅蓚€(gè)線程都發(fā)現(xiàn)HashMap需要重新調(diào)整大小了,它們會(huì)同時(shí)試著調(diào)整大小。在調(diào)整大小的過程中,存儲(chǔ)在LinkedList中的元素的次序會(huì)反過來,因?yàn)橐苿?dòng)到新的bucket位置的時(shí)候,HashMap并不會(huì)將元素放在LinkedList的尾部,而是放在頭部,這是為了避免尾部遍歷(tail traversing)。如果條件競(jìng)爭(zhēng)發(fā)生了,那么就死循環(huán)了。(在多線程的情況下,為什么還要使用HashMap呢?不懂)

我們也可以使用自定義的對(duì)象作為鍵,只要它遵守了equals()和hashCode()方法的定義規(guī)則,并且當(dāng)對(duì)象插入到Map中之后將不會(huì)再改變了。如果這個(gè)自定義對(duì)象時(shí)不可變的,那么它已經(jīng)滿足了作為鍵的條件,因?yàn)楫?dāng)它創(chuàng)建之后就已經(jīng)不能改變了。

我們可以使用CocurrentHashMap來代替HashTable嗎?這是另外一個(gè)很熱門的面試題,因?yàn)镃oncurrentHashMap越來越多人用了。我們知道HashTable是synchronized的,但是ConcurrentHashMap同步性能更好,因?yàn)樗鼉H僅根據(jù)同步級(jí)別對(duì)map的一部分進(jìn)行上鎖。ConcurrentHashMap當(dāng)然可以代替HashTable,但是HashTable提供更強(qiáng)的線程安全性。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲综合小说网| 少妇太紧太爽又黄又硬又爽小说| 日本蜜桃在线观看| **欧美日韩在线| 日韩网站在线观看| 男人午夜视频在线观看| 先锋影音国产精品| 国产视频一区在线观看| 久久九九久久九九| 欧美超级免费视 在线| 丰满少妇xbxb毛片日本| 国产激情自拍| 永久免费网站在线| 亚洲成人激情社区| 97热精品视频官网| 国产精品第一视频| 日韩精品视频免费专区在线播放| 天天综合永久入口| 国内精品视频在线观看| 亚洲草久电影| 亚洲一区二区福利| 国产精品一区二区三区久久久| 一区二区三区四区在线看| 国产精品a久久久久| 乱老熟女一区二区三区| 亚洲国产日韩在线| 最近免费中文字幕中文高清百度| 欧美精品自拍视频| 日韩Av无码精品| 在线视频婷婷| 久久久久亚洲av成人无码电影| 免费av在线网址| 国产精品久久久久久久久久免费看| 日韩大片在线免费观看| 影视亚洲一区二区三区| 免费国产h视频在线观看86| 韩国欧美一区二区| 激情综合视频| 5858p先锋影音资源网| 婷婷开心久久网| 99国产精品久久久久久久成人| 日韩欧美精品一区二区| 欧美日韩高清免费| 91蜜臀精品国产自偷在线| 日本成本人片免费观看| 一二三四视频免费观看在线看| 岛国片在线免费观看| 久久久亚洲欧洲日产国码αv| 亚洲高清不卡在线观看| 91丝袜脚交足在线播放| 成人av在线天堂| 99国产视频| 亚洲国产精品综合小说图片区| 欧美日韩国产123区| 国产成人在线一区| 成人午夜激情免费视频| 成人自拍偷拍| 久久久久久久久一| 视频亚洲一区二区| 一本色道久久综合亚洲aⅴ蜜桃| av网站在线免费看| 日韩精品一二| 亚洲美女黄网| 99久久免费精品| 免费观看亚洲视频大全| 色偷偷偷亚洲综合网另类| 性少妇videosexfreexxx片| 51视频国产精品一区二区| 日韩最新免费不卡| 久久精品水蜜桃av综合天堂| 欧美猛少妇色xxxxx| 风间由美一二三区av片| 色偷偷7777www人| 欧美日韩日日摸| 欧美日韩一二三| 成人永久在线| 在线播放性xxx欧美| 亚洲大片精品永久免费| 日本视频免费高清一本18| 三级在线视频观看| 成人动态视频| 国产精品不卡一区二区三区在线观看| 中文国产成人精品| 午夜视频1000| 国产裸体视频网站| 婷婷成人影院| 精品97人妻无码中文永久在线| 日本中文一区二区三区| 狠狠擦狠狠操| 熟女人妇 成熟妇女系列视频| 一区二区中文字幕在线观看| 在线中文字幕视频| 日本欧美爱爱爱| 亚洲精品小区久久久久久| 五月天亚洲激情| 日本三级视频网站| 91精品国产色综合久久不卡98| 国产精品一国产精品最新章节| av黄色免费在线观看| 欧美精品久久久久久久免费观看| 日韩mv欧美mv国产网站| 在线免费观看的av网站| 久九九久频精品短视频| 午夜视频在线免费播放| 狠狠入ady亚洲精品经典电影| 色在线免费视频| 成人高清在线观看视频| 欧美黄片一区二区三区| 亚洲成人午夜影院| 丰满少妇又爽又紧又丰满69| 亚洲一区二区在线免费看| 久久影院一区| 麻豆影院在线观看| 成人欧美一区二区三区黑人一| 国产欧美日韩三级| 色综合视频在线| 日韩av成人在线观看| 日韩一区亚洲二区| 高清不卡一区| 欧美一区二区三区电影| 免费黄色片在线观看| 亚洲精品承认| 18性欧美xxxⅹ性满足| 日本精品久久久久中文字幕| 成人免费黄色大片| www国产在线观看| 动漫av免费观看| 国产成人精品无码片区在线| 亚洲自拍的二区三区| 91小视频在线免费看| 成年免费视频黄网站在线观看| 爱看av在线入口| 亚洲图片小说视频| 欧美国产视频一区二区| 国产一区日韩欧美| 国产一区二区视频在线| 精品人妻一区二区三区潮喷在线| 经典三级久久| 国产精品嫩草影院av蜜臀| 久久久久久久国产精品视频| 成人免费网址在线| 少妇激情一区二区三区视频| 日韩精品免费一区| 诱人的瑜伽老师3hd中字| 欧美日韩电影一区二区三区| 亚洲视频自拍偷拍| 自拍视频在线| 亚洲精品国产品国语在线app| 精品国内一区二区三区免费视频| 国产精品私房写真福利视频| 国产精品久久综合av爱欲tv| 91麻豆6部合集magnet| 欧美激情欧美狂野欧美精品| 国产精品剧情一区二区在线观看| 国产精品入口日韩视频大尺度| 日本视频免费一区| 在线观看一区欧美| 日本一区二区三区四区| 亚洲成人影音| 国内外成人激情视频| 中文字幕av一区二区三区免费看| 日本在线视频网址| www.xxxx日本| 日韩欧美一区二区视频在线播放| 欧美日韩在线中文字幕| 人妻在线日韩免费视频| jazzjazz国产精品麻豆| 一个人看的日本免费视频| 日本韩国精品一区二区| 日韩一区免费| 91九色在线观看视频| 激情网站在线| 污污视频网站免费观看| 狠狠躁夜夜躁人人爽视频| 国内精品偷拍| 久久99精品网久久| 亚洲妇女屁股眼交7| 亚洲日本一区二区三区在线| av动漫免费观看| 波多野结衣网站| 精品视频在线播放色网色视频| 亚洲国产精品三区| 日本三日本三级少妇三级66| 99久久er热在这里只有精品15| 国产福利91精品一区二区三区| 日韩av在线中文| 韩国精品一区二区三区| 久久99精品国产自在现线小黄鸭| 伊人久久大香线蕉av超碰演员| 欧美孕妇与黑人巨交| 一区二区三区四区在线免费观看| 亚洲人成电影网站色…| 成人另类视频| 多人啪嗒啪嗒在线观看免费| 亚洲欧美另类图片小说| 五月综合激情| 日本欧美一区二区三区不卡视频| 亚洲欧美精品伊人久久| 亚洲精品喷潮一区二区三区| av大片在线看| 中日韩在线视频| 精品久久人人做人人爰| 国产成人高清精品免费5388| 亚洲国产一区二区三区四区| 男女一区二区三区免费| 亚洲综合视频一区| 不卡免费追剧大全电视剧网站| 成 人 黄 色 片 在线播放| 亚洲高清国产拍精品26u| 亚洲国产精彩中文乱码av| 看看黄色一级片| 欧美激情麻豆| 日韩亚洲一区中文字幕| 亚洲欧美小说国产图片| 欧美日韩一本到| 国产女主播一区二区三区| 91精品在线观看视频| 国产第一页在线观看| 欧美肉体xxxx裸体137大胆| 日本韩国欧美在线| 9lporm自拍视频区在线| 影音先锋中文字幕一区| 亚洲国产天堂av| 性生生活大片免费看视频| 欧美一级黑人aaaaaaa做受| 肉色欧美久久久久久久免费看| 亚洲午夜激情免费视频| 亚洲视频一区二区在线观看| 日韩一区二区视频在线观看| 久在线观看视频| 久久众筹精品私拍模特| 欧美一级网站| 日本不卡免费播放| 91 在线视频| 女人黄色免费在线观看| 日本一本a高清免费不卡| 一本大道亚洲视频| 中文字幕久久熟女蜜桃| 日本肉肉一区| 国产精品亚洲第五区在线| 免费日韩av片| 国产传媒欧美日韩成人精品大片| 久久精品一本久久99精品| 蜜桃视频网站在线| 美女隐私在线观看| 欧美高清在线| 91资源在线播放| 人妻精品无码一区二区三区| 日本小视频在线免费观看| 日本中文不卡| 精品久久久久久亚洲综合网| 国产福利在线视频| 日韩成人av一区二区| 日韩精品免费在线播放| 91福利免费| 97精品人妻一区二区三区香蕉| 亚洲激情在线视频| 国产三级伦理在线| 日本v片在线免费观看| 国产午夜精品一区理论片飘花| 在线综合+亚洲+欧美中文字幕| 国产日韩三级| 疯狂蹂躏欧美一区二区精品| 日韩成人av毛片| 国产成人在线一区| 日本福利视频导航| 久久中国妇女中文字幕| 国产一区二区三区毛片| 亚洲福利在线播放| 精品一区二区三区在线视频| 欧美日韩在线不卡视频| 亚洲色图图片网| 三级在线看中文字幕完整版| 蜜臀视频在线观看| 无码粉嫩虎白一线天在线观看| 手机在线中文字幕| 欧美 亚欧 日韩视频在线| 精品无码av无码免费专区| 一女二男一黄一片| 久草综合在线视频| 丝袜美腿亚洲一区二区图片| 欧美日韩一区综合| 日本中文字幕视频在线| 精品九九九九| 99thz桃花论族在线播放| 国产精品人成在线观看免费| 日本中文字幕在线视频| 日本a人精品| 狠狠躁18三区二区一区| 在线观看免费版| 日韩高清国产一区在线| 国产激情在线看| 不卡毛片在线看| 日韩一区二区三区不卡视频| 国产91对白刺激露脸在线观看| 中文字幕第一页在线播放| 欧美一区二区日韩一区二区| 午夜精品一区二区三| 亚洲欧美另类久久久精品| 免费一级欧美片在线播放| 在线永久免费观看黄网站| 视频一区视频二区视频三区视频四区国产| 亚洲精品xxxxx| 欧美性天天影院| 性欧美1819sex性高清大胸| 国产高清视频在线播放| 日日碰狠狠丁香久燥| 不卡av电影院| 日韩欧美国产中文字幕| 91久久久久久白丝白浆欲热蜜臀| 久久这里只有精品首页| 久久久久久久久久网站| www.香蕉视频在线观看| 精品久久99ma| 不卡的在线视频| 精品无码国产污污污免费网站| 久久伊人精品天天| 亚洲精品国产高清久久伦理二区| 豆花视频一区| 精品影院一区| 国产视频在线播放| 成人福利视频网站| 日本一区二区三区dvd视频在线| 五月天色网站| 国产原创在线视频| 亚洲精品水蜜桃| 四虎一区二区三区| 成年丰满熟妇午夜免费视频|