校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Java中對HashMap的深度分析

Java中對HashMap的深度分析

熱門標簽:電話機器人的特色和創新 漯河辦理400電話 騰訊地圖標注商戶改名注冊入駐 開封便宜外呼系統報價 地圖標注人員兼職 怎樣把地圖標注出來 淮南騰訊地圖標注 商丘百應電話機器人有沒有效果 黃石智能營銷電銷機器人效果
在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,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記錄其位置。
您可能感興趣的文章:
  • Java中HashMap和TreeMap的區別深入理解
  • JAVA HashMap詳細介紹和示例
  • java HashMap通過value反查key的代碼示例
  • Java中HashMap和Hashtable及HashSet的區別
  • java遍歷HashMap簡單的方法
  • 舉例詳解Java編程中HashMap的初始化以及遍歷的方法
  • java無鎖hashmap原理與實現詳解
  • Java8 HashMap的實現原理分析
  • java使用hashMap緩存保存數據的方法
  • Java HashMap的工作原理
  • 深入理解Java中的HashMap的實現機制
  • Java集合之HashMap用法詳解

標簽:大興安嶺 紅河 岳陽 拉薩 鄭州 武威 亳州 馬鞍山

巨人網絡通訊聲明:本文標題《Java中對HashMap的深度分析》,本文關鍵詞  Java,中對,HashMap,的,深度分析,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Java中對HashMap的深度分析》相關的同類信息!
  • 本頁收集關于Java中對HashMap的深度分析的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91久久免费观看| 99re成人精品视频| 亚洲永久精品国产| 亚洲美女电影在线| 亚洲视频一区二区免费在线观看| 久久精品男人的天堂| 精品国产免费人成电影在线观看四季 | 国产亚洲成年网址在线观看| 久久午夜电影网| 久久一区二区三区四区| 国产欧美日韩激情| 亚洲欧洲精品天堂一级| 亚洲一线二线三线视频| 丝袜诱惑亚洲看片| 国产自产v一区二区三区c| 国产乱码精品一区二区三| 成人激情开心网| 色噜噜狠狠色综合欧洲selulu| 欧美色精品天天在线观看视频| 欧美丝袜第三区| 日韩欧美国产不卡| 国产精品欧美一区喷水| 亚洲国产一区二区在线播放| 麻豆精品在线看| av资源网一区| 欧美一级欧美三级| 亚洲国产精品黑人久久久| 一区二区三区四区国产精品| 日韩av不卡在线观看| 国产成人av网站| 91福利在线播放| 久久日韩精品一区二区五区| 亚洲欧美欧美一区二区三区| 日本vs亚洲vs韩国一区三区 | 99久久99精品久久久久久| 色88888久久久久久影院野外| 日韩一区二区三区免费观看| 国产精品三级电影| 日本欧美久久久久免费播放网| 成人免费黄色大片| 欧美成人女星排名| 亚洲成人激情av| 欧美三级午夜理伦三级中视频| 精品欧美乱码久久久久久1区2区| 亚洲欧美日韩精品久久久久| 精品亚洲aⅴ乱码一区二区三区| 色噜噜狠狠色综合欧洲selulu| 日韩免费高清av| 亚洲二区视频在线| av中文一区二区三区| 精品精品国产高清一毛片一天堂| 亚洲综合色丁香婷婷六月图片| 成人性生交大合| 久久久亚洲精品石原莉奈| 日韩高清不卡在线| 欧美网站一区二区| 亚洲色图20p| 成人午夜短视频| 久久日一线二线三线suv| 免费久久精品视频| 欧美丰满嫩嫩电影| 亚洲一区二区精品久久av| 99精品久久99久久久久| 国产精品视频一二三| 国产成人av一区二区三区在线| 日韩三级视频在线看| 午夜视频一区二区三区| 欧美中文字幕一区二区三区亚洲| 亚洲人成网站色在线观看| 欧美视频精品在线| 亚洲综合区在线| 欧美性大战久久| 亚洲综合丝袜美腿| 欧美另类videos死尸| 日韩福利视频网| 日韩欧美一区在线| 免费的成人av| 欧美一级二级在线观看| 日本亚洲免费观看| 亚洲精品一区二区三区影院 | 七七婷婷婷婷精品国产| 91.com视频| 天天综合日日夜夜精品| 91精品欧美久久久久久动漫| 男人的天堂亚洲一区| 欧美成va人片在线观看| 国产精品1024久久| 国产精品久久免费看| 色爱区综合激月婷婷| 一区二区日韩av| 91精品婷婷国产综合久久 | 成人福利视频网站| 亚洲一区二区三区爽爽爽爽爽| 欧美日韩一区二区三区高清| 亚洲成人av福利| 日韩精品中午字幕| 成人国产精品视频| 亚洲一二三四在线观看| 精品1区2区在线观看| 成人免费视频免费观看| 亚洲精品高清视频在线观看| 欧美日韩视频在线第一区 | 日韩福利电影在线| 国产日韩欧美一区二区三区综合| 99在线热播精品免费| 日本欧美在线观看| 国产精品进线69影院| 在线成人高清不卡| 东方欧美亚洲色图在线| 亚洲成人www| 国产精品美女久久久久aⅴ国产馆| 色婷婷综合久久久久中文| 麻豆中文一区二区| 亚洲综合色在线| 久久精品一区二区三区不卡| 色婷婷综合久久久中文字幕| 免费成人在线观看| 亚洲色图一区二区三区| 2020国产精品久久精品美国| 91老师片黄在线观看| 韩国女主播一区二区三区| 亚洲综合区在线| 国产精品日产欧美久久久久| 中文字幕免费观看一区| 欧美乱熟臀69xxxxxx| 99re这里只有精品6| 国产乱人伦精品一区二区在线观看| 亚洲婷婷综合色高清在线| 日韩一二在线观看| 欧美性猛交xxxxxxxx| 91免费视频网址| 国产久卡久卡久卡久卡视频精品| 午夜视频在线观看一区| 亚洲人成精品久久久久久| 国产日韩欧美制服另类| 精品国免费一区二区三区| 欧美久久久久久久久中文字幕| 99久久夜色精品国产网站| 国产精品一区在线| 国产美女视频91| 狠狠v欧美v日韩v亚洲ⅴ| 免费人成黄页网站在线一区二区 | 美腿丝袜在线亚洲一区| 亚洲一区二区在线观看视频| 最新久久zyz资源站| 欧美国产1区2区| 欧美精彩视频一区二区三区| 精品国产免费人成在线观看| 日韩免费视频一区| 久久夜色精品国产欧美乱极品| 欧美一二三四区在线| 91精品国产91久久久久久最新毛片 | 精品无人码麻豆乱码1区2区| 美女网站一区二区| 韩国一区二区视频| 国产jizzjizz一区二区| 成人午夜视频在线观看| 99精品视频一区二区| 色综合天天综合网天天看片| 97aⅴ精品视频一二三区| aaa亚洲精品| 欧美亚洲愉拍一区二区| 欧美丰满高潮xxxx喷水动漫| 日韩一区二区免费在线电影 | 白白色 亚洲乱淫| av男人天堂一区| 91老师国产黑色丝袜在线| 欧美日韩1234| 精品国产一区二区三区不卡 | 色综合久久综合网| 欧美日韩在线综合| 欧美成人高清电影在线| 国产欧美日韩在线视频| 一区二区三区四区不卡在线| 亚洲1区2区3区视频| 久久国产视频网| 成人av网在线| 欧美午夜影院一区| 2019国产精品| 尤物在线观看一区| 免费亚洲电影在线| 成人h版在线观看| 欧美日韩一本到| 久久嫩草精品久久久久| 亚洲免费在线观看视频| 美女视频黄 久久| 一本久久综合亚洲鲁鲁五月天| 91精品在线免费观看| 日本一区二区三区高清不卡| 亚洲va欧美va人人爽午夜| 国产成人av电影免费在线观看| 欧美在线观看视频一区二区三区| 精品国产欧美一区二区| 1000部国产精品成人观看| 裸体歌舞表演一区二区| 91麻豆视频网站| 国产丝袜欧美中文另类| 日韩国产精品久久久久久亚洲| 96av麻豆蜜桃一区二区| 26uuu成人网一区二区三区|