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

首頁 > 學院 > 開發設計 > 正文

JavaCollections--HashMap深度分析與比較

2019-11-18 11:17:42
字體:
來源:轉載
供稿:網友

  在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》可恨的是,我之前就一直在找,我都找不到,他這樣一提,我就更加急了,可惜口袋空空啊~~5555
  
  不知道大家有沒有留意 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進去!注重??!這就是效率?。〖偃缒隳茏屇愕腍ashMap不需要重構那么多次,效率會大大提高!
  }
  
  說到這里也差不多了,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記錄,其位置。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩福利在线播放| 国产精品av电影| 欧美激情精品久久久久久久变态| 久久成人在线视频| 欧美精品videos性欧美| 国产综合福利在线| 欧美国产视频一区二区| 国产精品久久久久影院日本| 68精品国产免费久久久久久婷婷| 2019亚洲日韩新视频| 欧美日韩中文字幕在线视频| 国产在线视频2019最新视频| 欧美亚洲国产日韩2020| 精品亚洲国产视频| 高跟丝袜一区二区三区| 日韩电影视频免费| 亚洲一区av在线播放| 超碰精品一区二区三区乱码| 96pao国产成视频永久免费| 日韩国产欧美区| 亚洲精品国偷自产在线99热| 92裸体在线视频网站| 国产精品成人免费电影| 欧美成人国产va精品日本一级| 亚洲黄色av女优在线观看| 亚洲嫩模很污视频| 亚洲欧美日韩一区在线| 亚洲第一av网站| 亚洲国语精品自产拍在线观看| 2019亚洲男人天堂| 国产热re99久久6国产精品| 欧美电影《睫毛膏》| 亚洲国内精品在线| 激情久久av一区av二区av三区| 97在线观看视频国产| 久久久久久久国产精品视频| 91精品国产综合久久香蕉| 欧美激情奇米色| 亚洲精品网址在线观看| 日本国产高清不卡| 国产日韩精品视频| 久久亚洲精品小早川怜子66| 欧美精品videofree1080p| 成人午夜在线观看| 欧美专区日韩视频| 精品夜色国产国偷在线| 中文字幕亚洲色图| 欧美老少做受xxxx高潮| 欧美性猛交xxxx黑人猛交| 欧美大奶子在线| 91精品国产99| 国产成人精品亚洲精品| 国产精品美女久久久久av超清| 欧美日韩国内自拍| 久久视频在线视频| 日日噜噜噜夜夜爽亚洲精品| 欧美日韩亚洲国产一区| 国产日韩欧美一二三区| 国产精品久久婷婷六月丁香| 68精品国产免费久久久久久婷婷| 992tv在线成人免费观看| 中文字幕亚洲自拍| 欧美激情一区二区久久久| 国产精品96久久久久久又黄又硬| 国产中文字幕日韩| 国产69精品久久久久9999| 国产伦精品免费视频| 欧美激情中文网| 久久久91精品| 91色视频在线导航| 91在线免费观看网站| 日韩在线观看你懂的| 黄色精品一区二区| 韩国欧美亚洲国产| 国产成人精品免高潮在线观看| 日韩av123| 欧美一级免费看| 国产成人亚洲综合91精品| 欧美亚洲国产成人精品| 夜夜嗨av色综合久久久综合网| 国产91精品高潮白浆喷水| 欧美精品久久久久久久免费观看| 成人黄色免费看| 色婷婷成人综合| 亚洲视频网站在线观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲综合国产精品| 亚洲国产欧美久久| 中文字幕亚洲欧美日韩高清| 九九热99久久久国产盗摄| 国产成人精品日本亚洲| 欧美亚洲国产精品| 一本一本久久a久久精品牛牛影视| 亚洲国内精品在线| 久久精品99久久香蕉国产色戒| 国产亚洲欧洲高清| 亚洲成年人在线播放| 色婷婷av一区二区三区久久| 久久综合五月天| 九九热在线精品视频| 一个人看的www欧美| 日韩电影免费观看中文字幕| 亚洲综合中文字幕在线| 91chinesevideo永久地址| 韩国视频理论视频久久| 色婷婷成人综合| 一区国产精品视频| 97在线看免费观看视频在线观看| 综合136福利视频在线| 亚洲级视频在线观看免费1级| 欧美第一淫aaasss性| 久久精品人人爽| 少妇高潮 亚洲精品| 欧美激情精品久久久久久蜜臀| 久久婷婷国产麻豆91天堂| 欧美疯狂做受xxxx高潮| 夜夜嗨av一区二区三区免费区| 97人人模人人爽人人喊中文字| 国产美女精品视频免费观看| 国产精品综合不卡av| 久久久久免费精品国产| 成人写真福利网| 久久久亚洲欧洲日产国码aⅴ| 国产成人亚洲综合91精品| 成人精品福利视频| 91精品视频免费看| 亚洲精品在线91| 久久精品久久久久久国产 免费| 国产精品91久久| 亚洲色图第三页| 亚洲精品福利免费在线观看| 亚洲色图综合网| 国产精品网站视频| 热久久这里只有| 国产成人福利视频| 国产成人精品久久| 日本国产欧美一区二区三区| 国产精品久久久av| 91av在线播放| 在线电影欧美日韩一区二区私密| 国产成人午夜视频网址| 91视频九色网站| 国产精品男女猛烈高潮激情| 国产美女扒开尿口久久久| 久久97精品久久久久久久不卡| 亚洲最大av网站| 欧美日韩xxxxx| 国产精品黄色影片导航在线观看| 亚洲免费av片| 国产精品va在线播放| 国产精品盗摄久久久| 性欧美视频videos6一9| 久久亚洲成人精品| 亚洲www在线观看| 97国产一区二区精品久久呦| 久久精品99久久香蕉国产色戒| 亚洲欧美精品一区二区| 色小说视频一区| 国产在线98福利播放视频| 久久精品成人欧美大片| 一区二区三区精品99久久| 亚洲在线第一页| 欧美专区中文字幕| 日韩欧亚中文在线|