日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > 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'>valuekey 和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教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
中文字幕在线国产| 亚洲欧洲日韩精品在线| 亚洲小说春色综合另类网蜜桃| 国产欧美三级| 免费看黄资源大全高清| 日韩欧美在线不卡| 黄色一区二区在线| 日韩精品一区二区三区视频播放| 欧美一级久久| 亚洲伊人婷婷| 一级网站免费观看| 欧洲精品二区| 99精品一级欧美片免费播放| av免费看在线| 欧美日韩国产在线看| 日韩免费视频一区二区视频在线观看 | 午夜av一区二区| 日韩精品在线私人| 亚洲欧美视频一区二区三区| 国产偷国产偷亚洲清高网站| 精品国产欧美日韩不卡在线观看| 久久婷婷国产| 91精品国产手机| 人人做人人澡人人爽欧美| 精品国产1区2区3区| 国产在线播放一区二区| 91亚洲欧美| 精品久久人人做人人爽| 欧美久久一二三四区| 欧美亚洲视频在线看网址| 久久久99免费| 中文字幕亚洲视频| 精品成人久久久| 日韩精品一区二区三区视频播放| 亚洲成av人片| 1区2区在线| 韩日中文字幕第一页| 精品日韩在线观看| 91日韩欧美| 69av亚洲| 日韩wumaV| 国产欧美中文在线| 日韩一二三四区| 欧美日韩一级片在线观看| 亚洲黄色在线观看| 亚洲va中文字幕| 黄色一区二区在线| 精品国产99| 亚洲乱码在线观看| 欧美99久久| 日韩欧美中文字幕在线观看| 国产在线播放一区二区| 久草亚洲一区| 狠狠色噜噜狠狠狠狠97| 亚洲视频在线观看日本a| 中文字幕在线官网| 亚洲一级网站| 99综合精品久久| 亚洲欧洲日韩精品在线| 中文欧美字幕免费| 最近中文字幕在线中文高清版| 国产网站欧美日韩免费精品在线观看| 国产一区精品在线| 国产亚洲人成a一在线v站| 色屁屁一区二区| 精品福利二区三区| 欧美日韩成人综合| 亚洲最新永久观看在线| 国产中文伊人| 国产欧美综合视频| 亚洲视频在线观看三级 | 99精品在线播放| 国产欧美日韩亚洲| 欧美日韩中文字幕| 欧美日韩性视频| 中文精品电影| 日韩欧美亚洲国产| 丰满少妇一区二区| 欧美日韩综合在线免费观看| 日韩在线视频一区二区三区| 婷婷久久综合九色国产成人| 中文欧美字幕免费| 久久精品黄色片| 欧美不卡视频| 日韩精品在线第一页| 天天综合天天添夜夜添狠狠添| 色欧美日韩亚洲| 二区视频在线观看| 一级特黄aaa大片在线观看| 国产欧美综合在线观看第十页| 国产99在线|亚洲| 欧美亚洲天堂网| 天天综合天天做| 亚洲视频色图| 日本亚洲欧美天堂免费| 中文字幕亚洲在| 91精品国产色综合久久久蜜香臀| 日韩视频在线一区| 国产九九在线| 一区二区三区久久| 日韩在线高清视频| 亚洲国产欧美日韩在线| 日本精品二区| 一区免费视频| 欧美 日韩 国产在线| 亚洲视频在线观看日本a | 国产欧美日韩中文字幕在线| 国产婷婷一区二区| 中文字幕在线视频第一页| 国产日韩精品电影| 92久久精品| 一区二区视频在线| 日韩一级在线视频| 久久久久蜜桃| 日韩午夜中文字幕| 欧美一级日韩不卡播放免费| 91精品国产91久久| 在线中文免费视频| 首页国产欧美久久| 欧美二区在线观看| 欧美亚洲视频在线看网址| 精品视频999| 欧美日韩精品免费| 久久精品久久久久| 欧美不卡视频一区发布| 国产精品一区二三区| 1区2区在线| 国产丝袜一区| 日韩精品视频网站| 亚洲va韩国va欧美va精品| 中文字幕亚洲欧美| 91精品国产日韩91久久久久久| 91精品国产91久久久久久不卡 | 中文字幕精品国产| 精品国自产在线观看| 1区2区在线| lutube成人福利在线观看| 精品三级久久| 亚洲欧洲精品在线| 日韩在线视频免费观看高清中文| 欧美日韩精品是欧美日韩精品| 日本国产在线视频| 日韩精品午夜| 亚洲欧美韩国综合色| 中文字幕第一页在线播放| 成人精品视频一区| 日韩视频一区| 欧美日韩国产观看视频| 久久精品在线观看| 成人xxxx| 亚洲第一网中文字幕| 欧美亚洲天堂网| 国产不卡视频在线| 国产性一级片| 日韩国产高清一区| 中文在线一区二区| 亚洲丝袜一区| 二区视频在线观看| 日韩精品在线视频| 在线不卡一区二区| 在线视频亚洲| 精品视频在线导航| 亚洲va韩国va欧美va精品| 日韩区欧美区| 国产1区在线| 国产最顶级的黄色片在线免费观看| 欧美日韩精品是欧美日韩精品| 亚洲a级在线播放观看| 日韩欧美亚洲视频| 亚洲 欧美 精品| 黄色精品在线观看| 日韩精品视频在线观看免费| 日韩在线a电影| 国产视频aaa| 亚洲大片精品永久免费| 日韩午夜黄色| 99精品在线播放| 精品国自产在线观看| 婷婷综合福利| 91最新在线| 国产成人精品综合久久久| 欧美日韩在线不卡| 日韩区欧美区| 99视频在线看| 色一区在线观看| 丰满少妇一区二区| 欧美婷婷精品激情| 精品国产欧美日韩| 日韩av综合在线观看| 国产一二三区精品视频| 亚洲成人7777| 欧美日韩国产综合视频在线观看中文| 欧美人妻一区二区三区| 欧美日韩精品综合| 精品国产综合久久| 丰满少妇一区| 日韩视频一区| 久久精品在线免费观看| 中文字幕日韩高清| 国产在成人精品线拍偷自揄拍| 精品久久91| 国产99亚洲| 欧美日韩免费不卡视频一区二区三区| 久久精品人妻一区二区三区| 欧美日韩国产区| 亚洲一区在线观看网站| 999精品视频在线观看播放| 国产黄在线观看| 99久久www免费| av免费观看网站| 国产在线观看精品| 国产欧美日韩最新| 亚洲福利在线视频| 91精品久久久久久久久久| 日韩欧美国产黄色| 国产一区精品| 日韩欧美中文字幕精品| 亚洲制服丝袜一区| 午夜国产福利一区二区| 欧美日韩综合色| 在线视频三区| 日韩不卡中文字幕| 日韩精品大片| 国产调教精品| 国产不卡在线观看视频| 国产欧美高清在线| 国产成人精品综合久久久| 国产日韩av高清| 中文字幕在线中文字幕二区| 欧美高清视频一区二区三区| 日韩精品福利一区二区三区| 欧美日韩综合在线免费观看| 精品久久91| 一区三区二区视频| 精品熟女一区二区三区| 日韩欧美一级精品久久| 中文字幕亚洲在| 午夜国产视频| 欧美日韩精品在线播放| 99综合视频| 亚洲福利精品视频| 欧美日韩精品在线观看| 天天摸日日摸狠狠添| 国产福利久久久| 免费高清特黄a大片| 日韩欧美一二三四区| www.精品视频| 日本国产在线视频| 亚洲va韩国va欧美va精品| 中文字幕亚洲一区二区av在线| 日韩精品欧美| 欧美啪啪一区| 日韩在线精品视频| 精品国产网站在线观看| 国产最新在线| 91精品国产乱码久久蜜臀| 国产乱国产乱300精品| 久久久另类综合| 人人做人人澡人人爽欧美| 日韩视频在线免费播放| 日韩中文字幕观看| 激情五月综合| 日韩福利视频导航| 中文字幕日韩精品在线| 精品久久香蕉国产线看观看gif| 91日韩中文字幕| 99久久www免费| 中文在线视频观看| 一区视频在线播放| 国产日韩亚洲欧美| 日韩不卡高清视频| 国产最新在线| 欧美日韩国产不卡| 国产资源在线观看| 91精品电影| 国产欧美日韩在线看| 国产最新在线| 亚洲va韩国va欧美va精品| 91麻豆免费视频网站| 国产一区不卡在线| av免费在线网站| 中文字幕日韩欧美| 国产中文在线观看| 久99久视频| 国产高清大尺度一区二区不卡| 中文字幕在线视频网| 日韩在线精品| 婷婷中文字幕在线观看| 在线黄色国产电影| 国产三级免费观看| 99视频一区| 91精品国产经典在线观看| 精品国自产在线观看| 日韩你懂的电影在线观看| 国产字幕在线看| 国产一卡二卡3卡4卡四卡在线| 欧美不卡视频一区发布| 亚洲热线99精品视频| av免费在线网站| 国产 中文 字幕 日韩 在线| 欧美日韩综合视频网址| 精品日韩在线观看| 婷婷中文字幕一区| www.三级.com| 一区二区三区精品久久久| 欧美一级久久| 国产三级中文字幕| 久久韩国免费视频| 精品视频资源站| 日韩在线精品视频| 中文字幕第一页在线| 欧美日韩高清不卡| 精品在线99| 精品久久久网| 日韩亚洲一区中文字幕| 国产欧美久久久久久久久| 中文字幕精品一区二| 久久99精品久久久| 久久精品网站免费观看| 欧美高清视频一区二区三区| 久久手机免费观看| 中文字幕欧美日韩| 韩国av一区二区| 激情五月综合| 一区免费视频| 亚洲成年人在线播放| 国产欧美日韩三级| 日韩中文字幕在线视频播放| 免费视频国产一区| 日韩视频在线一区二区三区| 高清国产一区| 激情婷婷亚洲| 欧美日韩精品国产| 蜜桃视频一日韩欧美专区| 精品久久香蕉国产线看观看gif| 国产一区日韩欧美| 日本黄色一区二区| 亚洲国产欧美日韩精品| 日韩精品视频在线观看网址 | 欧美一级搡bbbb搡bbbb| 91精品视频国产| 国产一区日韩欧美| 国产一级片网站| 91久久精品网| av免费网站在线观看| 国产黄色网页| 国产日韩精品久久久| 色www精品视频在线观看| 国产91久久久久蜜臀青青天草二 | 在线视频色在线| 美日韩精品免费视频| av免费观看国产| 国产亚洲短视频| av影视在线看| 欧美自拍一区| 亚洲乱码在线观看| 欧美日韩国产一中文字不卡| 日韩欧美中文| 免费看ww视频网站入口| 精品国产免费观看一区| 精品国产1区二区| 欧美中文字幕精品| 天天综合天天做| 蜜桃视频一日韩欧美专区| 国产www.大片在线| 天天综合天天| 91国内精品在线视频| 国产无遮挡在线视频免费观看| 中文字幕 乱码 中文乱码91| 日韩在线观看视频一区| 精品一二三四| 亚洲国产午夜精品| 国产在线第一页| 欧美日韩国产在线观看| www.久久草| 精品1区2区3区| 91精品国产99| 人妻一区二区三区免费| 国产午夜精品全部视频播放| 日韩三级视频中文字幕| 欧美亚洲另类制服自拍| 日韩av中文字幕一区| 精品av中文字幕在线毛片| 欧美日韩国产黄色| 久久99精品久久久久子伦| 91精品在线看V| 欧美久久在线| 一级特黄aaa大片在线观看| 偷窥国产亚洲免费视频| 91精品免费在线观看| 国产福利精品导航| 欧美.日韩.国产.一区.二区| 久久夜色精品国产欧美乱极品| 久久精品一级爱片| 中文字幕亚洲字幕| www.狠狠| 91精品国产自产在线丝袜啪| 日韩美女视频一区二区在线观看| 精品国产欧美日韩| 久久精品www|