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

首頁 > 編程 > Java > 正文

Java中對HashMap的深度分析

2020-03-24 16:15:37
字體:
來源:轉載
供稿:網友
Java的世界里,無論類還是各種數據,其結構的處理是整個程序的邏輯以及性能的關鍵。由于本人接觸了一個有關性能與邏輯同時并存的問題,于是就開始研究這方面的問題。找遍了大大小小的論壇,也把《Java 虛擬機規范》,《apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector》,和《Thinking in Java》翻了也找不到很好的答案,于是一氣之下把JDK的 src 解壓出來研究,擴然開朗,遂寫此文,跟大家分享感受和順便驗證我理解還有沒有漏洞。 這里就拿HashMap來研究吧。

HashMap可謂JDK的一大實用工具,把各個Object映射起來,實現了“鍵--值”對應的快速存取。但實際里面做了些什么呢?

在這之前,先介紹一下負載因子和容量的屬性。大家都知道其實一個 HashMap 的實際容量就 因子*容量,其默認值是 16×0.75=12; 這個很重要,對效率很一定影響!當存入HashMap的對象超過這個容量時,HashMap 就會重新構造存取表。這就是一個大問題,我后面慢慢介紹,反正,如果你已經知道你大概要存放多少個對象,最好設為該實際容量的能接受的數字。

兩個關鍵的方法,put和get:

先有這樣一個概念,HashMap是聲明了 Map,Cloneable, Serializable 接口,和繼承了 AbstractMap 類,里面的 Iterator 其實主要都是其內部類HashIterator 和其他幾個 iterator 類實現,當然還有一個很重要的繼承了Map.Entry 的 Entry 內部類,由于大家都有源代碼,大家有興趣可以看看這部分,我主要想說明的是 Entry 內部類。它包含了hash,html' target='_blank'>value,key 和next 這四個屬性,很重要。put的源碼如下

public Object put(Object key, Object value) {
Object k = maskNull(key);

這個就是判斷鍵值是否為空,并不很深奧,其實如果為空,它會返回一個static Object 作為鍵值,這就是為什么HashMap允許空鍵值的原因。

int hash = hash(k);
int i = indexFor(hash, table.length);

這連續的兩步就是 HashMap 最牛的地方!研究完我都汗顏了,其中 hash 就是通過 key 這個Object的 hashcode 進行 hash,然后通過 indexFor 獲得在Object table的索引值。

table???不要驚訝,其實HashMap也神不到哪里去,它就是用 table 來放的。最牛的就是用 hash 能正確的返回索引。其中的hash算法,我跟JDK的作者 Doug 聯系過,他建議我看看《The art of programing vol3》可恨的是,我之前就一直在找,我都找不到,他這樣一提,我就更加急了,可惜口袋空空?。。。?

不知道大家有沒有留意 put 其實是一個有返回的方法,它會把相同鍵值的 put 覆蓋掉并返回舊的值!如下方法徹底說明了 HashMap 的結構,其實就是一個表加上在相應位置的Entry的鏈表:

for (Entry e = table[i]; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
Object oldvalue = e.value;
e.value = value; //把新的值賦予給對應鍵值。
e.recordAccess(this); //空方法,留待實現
return oldvalue; //返回相同鍵值的對應的舊的值。
}
}
modCount++; //結構性更改的次數
addEntry(hash, k, value, i); //添加新元素,關鍵所在!
return null; //沒有相同的鍵值返回
}

我們把關鍵的方法拿出來分析:

void addEntry(int hash, Object key, Object value, int bucketIndex) {
table[bucketIndex] = new Entry(hash, key, value, table[bucketIndex]);

因為 hash 的算法有可能令不同的鍵值有相同的hash碼并有相同的table索引,如:key=“33”和key=Object g的hash都是-8901334,那它經過indexfor之后的索引一定都為i,這樣在new的時候這個Entry的next就會指向這個原本的table[i],再有下一個也如此,形成一個鏈表,和put的循環對定e.next獲得舊的值。到這里,HashMap的結構,大家也十分明白了吧?

if (size++ = threshold) //這個threshold就是能實際容納的量
resize(2 * table.length); //超出這個容量就會將Object table重構

所謂的重構也不神,就是建一個兩倍大的table(我在別的論壇上看到有人說是兩倍加1,把我騙了),然后再一個個indexfor進去!注意!!這就是效率!!如果你能讓你的HashMap不需要重構那么多次,效率會大大提高!

說到這里也差不多了,get比put簡單得多,大家,了解put,get也差不了多少了。對于collections我是認為,它是適合廣泛的,當不完全適合特有的,如果大家的程序需要特殊的用途,自己寫吧,其實很簡單。(作者是這樣跟我說的,他還建議我用LinkedHashMap,我看了源碼以后發現,LinkHashMap其實就是繼承HashMap的,然后override相應的方法,有興趣的同人,自己looklook)建個 Object table,寫相應的算法,就ok啦。

舉個例子吧,像 Vector,list 啊什么的其實都很簡單,最多就多了的同步的聲明,其實如果要實現像Vector那種,插入,刪除不多的,可以用一個Object table來實現,按索引存取,添加等。

如果插入,刪除比較多的,可以建兩個Object table,然后每個元素用含有next結構的,一個table存,如果要插入到i,但是i已經有元素,用next連起來,然后size++,并在另一個table記錄其位置。html教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲日本黄色| 中文字幕一精品亚洲无线一区| 麻豆乱码国产一区二区三区| 欧美精品18videos性欧美| 欧美刺激性大交免费视频| 岛国av一区二区在线在线观看| 美日韩在线视频| 日韩中文字幕视频在线观看| 日日噜噜噜夜夜爽亚洲精品| 欧美高清videos高潮hd| 亚洲第一福利在线观看| 亚洲理论片在线观看| 欧美黑人一区二区三区| 亚洲欧美国产制服动漫| 精品中文字幕久久久久久| 日韩在线观看免费全集电视剧网站| 亚洲最新av网址| 久久这里有精品| 中文字幕综合一区| 日韩在线精品一区| 久久69精品久久久久久久电影好| 欧美丰满少妇xxxxx做受| 97色在线观看| 国产成人在线一区二区| 日本国产欧美一区二区三区| 国产在线观看精品一区二区三区| 亚洲天天在线日亚洲洲精| 亚洲国产精品久久久久秋霞蜜臀| 欧美激情精品久久久久久蜜臀| 国产精品高潮呻吟久久av黑人| 国产成人鲁鲁免费视频a| 欧美最猛性xxxx| 国产成人精品久久亚洲高清不卡| 在线日韩第一页| 欧美裸体男粗大视频在线观看| 日韩免费看的电影电视剧大全| 成人高清视频观看www| 91精品视频大全| 啪一啪鲁一鲁2019在线视频| 久久精品国产精品| 久久伊人免费视频| 日韩日本欧美亚洲| 这里只有精品视频在线| 日韩欧美中文字幕在线观看| 亚洲аv电影天堂网| 成人网在线免费看| 欧美性一区二区三区| 久久久999精品| 国产欧美一区二区三区在线| 不卡av在线网站| 亚洲国产精品网站| 亚洲欧美精品中文字幕在线| 久久久伊人日本| 亚洲福利在线播放| 91天堂在线视频| 久久久久久久成人| 国产欧美日韩最新| 亚洲一级片在线看| www.99久久热国产日韩欧美.com| 久久成人一区二区| 国产精品视频一区二区高潮| 欧美国产精品人人做人人爱| 欧美多人乱p欧美4p久久| 午夜精品福利在线观看| 97久久国产精品| 91精品久久久久久综合乱菊| 久久91亚洲精品中文字幕奶水| 国产精品自产拍在线观看中文| 少妇精69xxtheporn| 欧美成人免费全部| 亚洲精品视频久久| 日韩在线观看免费全集电视剧网站| 成人福利免费观看| 91在线看www| 成人夜晚看av| 欧美日韩国产精品| 欧美亚洲国产成人精品| 成人免费在线视频网址| 日韩av在线影视| 一本大道香蕉久在线播放29| 日韩在线视频线视频免费网站| 亚洲全黄一级网站| 国产精品网站大全| 国产午夜精品一区二区三区| 亚洲深夜福利在线| 欧美—级a级欧美特级ar全黄| 亚洲天堂av在线播放| 国产精品极品美女粉嫩高清在线| 久久精品人人爽| 亚洲欧美成人网| 中文字幕亚洲一区| 欧美视频在线看| 欧美视频专区一二在线观看| 亚洲最大的网站| 日韩av大片在线| 欧美一级电影在线| 韩日精品中文字幕| 92国产精品久久久久首页| 91精品视频专区| 国产精品视频yy9099| 亚洲第一在线视频| 国产不卡一区二区在线播放| 亚洲精品小视频在线观看| 亚洲影院在线看| 国产精品999999| 91在线色戒在线| 国产精品一区专区欧美日韩| 国产成人一区二区三区电影| 欧美精品第一页在线播放| 中文字幕免费精品一区高清| 国产国语videosex另类| 日韩在线一区二区三区免费视频| 欧美激情亚洲视频| 91欧美精品成人综合在线观看| 亚洲国产精品推荐| 亚洲精品视频网上网址在线观看| 亚洲精品资源美女情侣酒店| 国产精品久久久久久久久男| 亚洲三级黄色在线观看| 久久中国妇女中文字幕| 国产精品第8页| 最近2019中文字幕第三页视频| 精品久久久久人成| 国产不卡av在线| 日韩美女在线观看| 日韩成人在线视频网站| www.亚洲一二| 亚洲综合在线小说| 亚洲成人中文字幕| 亚洲成av人片在线观看香蕉| 久色乳综合思思在线视频| 亚洲欧美日韩精品| 九九热这里只有精品6| 国产精品永久免费视频| 久久影院资源站| 一本色道久久综合亚洲精品小说| 成人免费淫片aa视频免费| 久久九九精品99国产精品| 欧美日本在线视频中文字字幕| 国产黑人绿帽在线第一区| 亚洲精品免费在线视频| 韩剧1988在线观看免费完整版| 日韩中文字幕免费看| 一本色道久久综合狠狠躁篇的优点| 欧美国产乱视频| 欧美专区福利在线| 国产精品夫妻激情| 日韩精品视频中文在线观看| 久久精品视频一| 国产成人精品午夜| 国产91露脸中文字幕在线| 亚洲一区二区三区毛片| 亚洲最大的av网站| 色在人av网站天堂精品| 久久香蕉精品香蕉| 在线日韩第一页| 国内精品免费午夜毛片| 国产一级揄自揄精品视频| 国产在线拍揄自揄视频不卡99| 26uuu另类亚洲欧美日本老年| 日本国产欧美一区二区三区| 亚洲国产精品国自产拍av秋霞| 欧美极品欧美精品欧美视频| 国产成人免费av|