久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

如何用源碼分析JavaHashMap實(shí)例

本篇文章為大家展示了如何用源碼分析Java HashMap實(shí)例,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站專注于尋烏網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供尋烏營銷型網(wǎng)站建設(shè),尋烏網(wǎng)站制作、尋烏網(wǎng)頁設(shè)計(jì)、尋烏網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造尋烏網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供尋烏網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

引言

HashMap在鍵值對存儲中被經(jīng)常使用,那么它到底是如何實(shí)現(xiàn)鍵值存儲的呢?

一 Entry

Entry是Map接口中的一個(gè)內(nèi)部接口,它是實(shí)現(xiàn)鍵值對存儲關(guān)鍵。在HashMap中,有Entry的實(shí)現(xiàn)類,叫做Entry。Entry類很簡 單,里面包含key,value,由外部引入的hash,還有指向下一個(gè)Entry對象的引用,和數(shù)據(jù)結(jié)構(gòu)中學(xué)的鏈表中的note節(jié)點(diǎn)很類似。

Entry類的屬性和構(gòu)造函數(shù):

final K key; V value; Entry<K,V> next; int hash; /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; }

二 HashMap的初始化

//HashMap構(gòu)造方法 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0)   throw new IllegalArgumentException("Illegal initial capacity: " +              initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY)   initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor))   throw new IllegalArgumentException("Illegal load factor: " +              loadFactor); this.loadFactor = loadFactor; threshold = initialCapacity; init(); }

這是HashMap的構(gòu)造函數(shù)之一,其他構(gòu)造函數(shù)都引用這個(gè)構(gòu)造函數(shù)進(jìn)行初始化。參數(shù)InitialCapacity指的是HashMap中 table數(shù)組最初的大小,參數(shù)loadFactory指的是HashMap可容納鍵值對與數(shù)組長度的比值(舉個(gè)例子:數(shù)組長度默認(rèn)值為 16,loadFactory默認(rèn)值為0.75,如果HashMap中存儲的鍵值對即Entry多于12,則會進(jìn)行擴(kuò)容,擴(kuò)容后大小為當(dāng)前數(shù)組長度的2 倍)。在構(gòu)造函數(shù)中不會對數(shù)組進(jìn)行初始化,只有在put等操作方法內(nèi)會進(jìn)行判斷是否要初始化或擴(kuò)容。

三 table數(shù)組

在HashMap中有一個(gè)概念叫做threshold(實(shí)際可容納量),實(shí)際可容納量指的是在HashMap中允許存在最多的Entry的個(gè)數(shù),它 是由HashMap中內(nèi)置的數(shù)組table的長度*load factory(負(fù)載因子)得來。其作用是保證HashMap的效率。

table數(shù)組是HashMap實(shí)現(xiàn)鍵值對存儲的又一關(guān)鍵,具體鍵值對是怎么存的呢?請看下圖

如何用源碼分析Java HashMap實(shí)例

如圖中的[key,value]就是Entry對象來實(shí)現(xiàn)的,而table數(shù)組是用來存放Entry對象的。

//數(shù)組的初始化:

private static int roundUpToPowerOf2(int number) { return number >= MAXIMUM_CAPACITY    ? MAXIMUM_CAPACITY    : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1; } private void inflateTable(int toSize) { // Find a power of 2 >= toSize int capacity = roundUpToPowerOf2(toSize); threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1); table = new Entry[capacity]; initHashSeedAsNeeded(capacity); }

在put等方法中發(fā)現(xiàn)數(shù)組未進(jìn)行初始化時(shí)會調(diào)用InflateTable方法進(jìn)行初始化,輸入?yún)?shù)為初始設(shè)置的InitialCapacity,實(shí) 際上他會調(diào)用roundUpToPowerOf2方法返回一個(gè)比初始容量大的最小的2的冪數(shù)(其中一個(gè)原因是在得到Entry所在數(shù)組位置時(shí)方便)。

四 put方法

public V put(K key, V value) { if (table == EMPTY_TABLE) {   inflateTable(threshold); } if (key == null)   return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) {   Object k;   if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {    V oldValue = e.value;    e.value = value;    e.recordAccess(this);    return oldValue;   } } modCount++; addEntry(hash, key, value, i); return null; } private V putForNullKey(V value) { for (Entry<K,V> e = table[0]; e != null; e = e.next) {   if (e.key == null) {    V oldValue = e.value;    e.value = value;    e.recordAccess(this);    return oldValue;   } } modCount++; addEntry(0, null, value, 0); return null; } void addEntry(int hash, K key, V value, int bucketIndex) { if ((size >= threshold) && (null != table[bucketIndex])) {   resize(2 * table.length);   hash = (null != key) ? hash(key) : 0;   bucketIndex = indexFor(hash, table.length); } createEntry(hash, key, value, bucketIndex); } void createEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<>(hash, key, value, e); size++; }

在put方法中

1. 首先會判斷數(shù)組是否為空,如果為空會對數(shù)組進(jìn)行初始化。

2. 接下來判斷key是否為null,如果為null就采用第二個(gè)方法對鍵值對進(jìn)行put。

3. 接下來對key進(jìn)行hash得到一個(gè)數(shù)值,再對這個(gè)數(shù)值進(jìn)行處理(IndexFor方法)得到所在數(shù)組中的位置。

4. 接下來會遍歷所在數(shù)組位置的鏈表,如果key的hash和傳入key的hash相同且(key內(nèi)存地址相等 或 equals方法相等),則意味著會更新在鏈表中的value值,并返回舊的value值。

5. 如果上邊的方法都沒有奏效,則會調(diào)用第三個(gè)方法,創(chuàng)建一個(gè)新的Entry對象。

在putForNullKey方法中 ,我們看到它是為了NULL值專門設(shè)置的,NULL值的hash始終為0,所以key為NULL的Entry對象肯定在數(shù)組的第0個(gè)位置。同樣,如果找到則更新,沒有找到則添加。

調(diào)用addEntry方法  意味著要往這個(gè)數(shù)組鏈表中添加一個(gè)Entry,所以會在最開始判斷已經(jīng)存在的Entry數(shù)量是否超過了實(shí)際可容納量。如果超過了,則會調(diào)用resize方 法將數(shù)組擴(kuò)大兩倍,注意在擴(kuò)大之后會對已經(jīng)存入的Entry進(jìn)行重排,原因是當(dāng)初存入時(shí)IndexFor方法與數(shù)組長度有關(guān)系。接著會調(diào)用第四個(gè)方法。

createEntry方法 很簡單,就是將原本在數(shù)組中存放的鏈表頭置入到新的Entry之后,將新的Entry放入數(shù)組中。從這里我們可以看出HashMap不保證順序問題。

get方法和contains方法原理和put方法一致,即先通過對key的hash得到其value值所在的鏈表頭在數(shù)組中的位置,再通過equals方法判斷value是否存在。

五 其他

//hash方法 final int hash(Object k) { int h = hashSeed; if (0 != h && k instanceof String) {   return sun.misc.Hashing.stringHash42((String) k); } h ^= k.hashCode(); // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }

hash方法中最終返回值與key的hashCode方法有關(guān)。

總結(jié)

  1. 最終數(shù)組初始化的容量大小會是大于等于你傳入初始容量的最小2的冪數(shù)。

  2. key為null或value為null能存入HashMap的原因是對null值會進(jìn)行單獨(dú)的操作。

  3. 在table數(shù)組中的鏈表中每個(gè)Entry的共同點(diǎn)是key的hash(key.hashCode)部分相同。

  4. 注意對key的hashCode和equals方法的重寫當(dāng)你想讓兩個(gè)key映射一個(gè)對象,因?yàn)榕卸╧ey相等的條件是(hashCode相等+(內(nèi)存相等 或 equals相等))。

  5. 最早存入的鍵值對會在鏈表的末端。

  6. 當(dāng)數(shù)組沒有鏈表存在時(shí),HashMap性能***為O(1)。而最差為O(threshould)。

上述內(nèi)容就是如何用源碼分析Java HashMap實(shí)例,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁標(biāo)題:如何用源碼分析JavaHashMap實(shí)例
文章起源:http://www.js-pz168.com/article22/jhhjjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站網(wǎng)站收錄軟件開發(fā)網(wǎng)站策劃網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
亚洲日本精品一区| 精品国产免费视频| 国产亚洲精品aa| 亚洲最色的网站| 国产精品99久久久久久久vr| www国产亚洲精品| 在线不卡日本| 精品国产成人系列| 亚洲成a天堂v人片| jlzzjlzz亚洲日本少妇| 日韩精品不卡| 欧美mv和日韩mv国产网站| 亚洲天堂福利av| 国产黑丝在线一区二区三区| 好吊色欧美一区二区三区| 欧美在线色视频| 国产精品久久久久久久久免费丝袜| 奇米影视一区二区三区小说| 97碰碰视频| 欧美少妇性性性| 亚洲天堂网中文字| 国产成人在线影院| 日韩成人av网站| 精品日本一线二线三线不卡| 香蕉加勒比综合久久| 91尤物视频在线观看| 91精品1区2区| 中文字幕在线观看一区| 国产精品伊人色| 色爱区成人综合网| 久久免费国产精品| 毛片不卡一区二区| 精品伦精品一区二区三区视频| 欧美伦理影视网| 一区二区三区**美女毛片| 成人性生交大片| 一本到三区不卡视频| 国产精品麻豆欧美日韩ww| 激情偷乱视频一区二区三区| 欧美日韩国产不卡在线看| 日韩欧美国产综合| 免费看欧美女人艹b| 狠狠色噜噜狠狠狠狠色吗综合| 91精品国产一区二区三区香蕉| 亚洲图片欧美视频| 99三级在线| 91精品免费在线| 午夜精品久久久久影视| 国产一区二区在线网站| 日韩一区二区三区免费看 | 亚洲二区在线观看| 97久久夜色精品国产九色| 欧美精品一二三| 婷婷久久综合九色综合绿巨人| 国产精品麻豆免费版| 日韩一级高清毛片| 久久精品99国产精品日本| 欧美另类一区| 国产精品日日摸夜夜摸av| 国产成人午夜99999| 色老汉av一区二区三区| 一区二区三区蜜桃| 国产精品有限公司| 欧美精品一区二区三区在线| 九九视频精品免费| 影音先锋欧美在线| 亚洲激情成人在线| 国产一区二区高清不卡| 亚洲精品在线观| 国产98色在线|日韩| 欧美少妇一区二区| 人人超碰91尤物精品国产| 日韩av一级大片| 亚洲欧美色一区| 国产精品一区二区三区四区五区 | 国产高清精品网站| 欧美在线免费观看视频| 香蕉av福利精品导航 | 亚洲区小说区图片区qvod| 91麻豆蜜桃一区二区三区| 日韩欧美在线123| 国产精品1024久久| 欧美久久高跟鞋激| 精品综合免费视频观看| 色久优优欧美色久优优| 午夜激情综合网| 亚洲一区二区精品在线| 亚洲一区二区在线免费看| 久久综合久久综合这里只有精品| 国产精品视频观看| 国产91免费视频| 国产欧美精品一区二区色综合朱莉| 成人av电影在线观看| 欧美一级片免费看| 国产精品一区二区你懂的| 欧美日韩精品欧美日韩精品一综合| 蜜桃av噜噜一区| 欧美综合在线视频| 久久99精品国产麻豆婷婷洗澡| 91国在线观看| 精品一区二区三区视频在线观看| 在线观看免费成人| 精品亚洲porn| 欧美精品tushy高清| 国产精品一区二区三区四区| 在线不卡的av| 成人一级视频在线观看| 日韩精品一区国产麻豆| 成人av在线播放网站| 久久综合九色综合欧美98| 91蝌蚪porny| 国产精品日产欧美久久久久| 韩国成人av| 亚洲精选视频免费看| 日韩福利一区二区三区| 亚洲va欧美va国产va天堂影院| 亚洲欧洲精品在线| 蜜臀av一区二区| 欧美日韩电影在线播放| 国产成人精品综合在线观看| 欧美tk丨vk视频| 国产高清在线一区| 亚洲乱码国产乱码精品精可以看 | 欧美极品色图| 亚洲大尺度视频在线观看| 色综合天天综合网天天看片| 精品一区二区久久久| 欧美一区二区黄色| 91在线看国产| 亚洲欧洲日韩女同| 色播亚洲婷婷| 日本成人中文字幕在线视频| 欧美另类久久久品| 91在线看国产| 亚洲欧洲av在线| 亚洲人久久久| 国产麻豆精品久久一二三| 精品国产乱码久久久久久老虎| 91丝袜高跟美女视频| 日韩毛片视频在线看| 一区二区三区久久网| 韩国女主播成人在线| 精品动漫一区二区三区在线观看| 国产精品一区二区三区免费观看 | 欧洲视频一区二区三区| 日韩国产一区二| 日韩视频免费直播| 国产一区自拍视频| 午夜精品久久久久久久99水蜜桃| 欧美日韩二区三区| 产国精品偷在线| 亚洲国产毛片aaaaa无费看 | 免费美女久久99| 精品国产免费一区二区三区香蕉| 精品一卡二卡三卡四卡日本乱码| 石原莉奈在线亚洲二区| 666欧美在线视频| 国产精品乱子乱xxxx| 午夜久久久久久久久| 91精品欧美综合在线观看最新 | 色姑娘综合网| 国产风韵犹存在线视精品| 中文字幕欧美激情| 色综合天天综合色综合av| 高清久久久久久| 亚洲欧美激情视频在线观看一区二区三区| 色狠狠桃花综合| 91精品国产综合久久久久久丝袜 | 成人av网站在线观看| 亚洲男人的天堂一区二区| 欧美色图激情小说| 国产精品yjizz| 日本aⅴ精品一区二区三区| 久久亚洲精华国产精华液| 日产精品久久久一区二区| 国产乱码精品一区二区三区忘忧草| 国产精品久久久久久亚洲毛片| 91久久久免费一区二区| 91在线播放视频| 免费高清在线一区| 国产欧美一区二区精品秋霞影院| 亚洲一区二区三区欧美| 99国产精品久久久久| 午夜在线成人av| 久久精品综合网| 欧洲精品一区二区三区在线观看| 国产激情一区二区三区在线观看| 蜜臀久久99精品久久久久久9| 国产喂奶挤奶一区二区三区| 中文字幕一区二区三区在线乱码| 99re6这里只有精品视频在线观看| 亚洲h精品动漫在线观看| 日韩一区二区在线观看视频播放| 欧美三级网色| voyeur盗摄精品| 日本欧美一区二区| 国产精品美女久久久久久久网站| 欧美少妇bbb| 欧美专区一二三| 99精品视频中文字幕|