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

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

基于散列的集合簡析

2019-11-10 19:20:28
字體:
來源:轉載
供稿:網友

HashMap簡析

基于散列的集合中,HashMap應該是用的最多的鍵值對容器,既然用的這么頻繁,我覺得還是很有必要搞清楚原理,而寫出來,思路會更清晰。 先看下簡單的繼承體系: 這里寫圖片描述 從圖上看,繼承體系很簡單,2個標記性接口,然后就是作為Map的功能,很單純。 然后再來看看數據結構圖: 這里寫圖片描述 圖上一個空格就代表一個節點,而每個key-value對都保存在一個節點中,下面的代碼正式HashMap每個節點的數據結構。 static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; } 從數據結構圖判斷,HashMap中肯定維護著一個數組,用來存儲每個節點,現在就有2個問題,如何在數組中定位自己的位置(行話叫:桶),萬一桶被占用了怎么辦? 既然叫HashMap,通過名字大概能夠猜想得出了,是通過hash值來定位的,通過hash算出自己桶的位置,然而位置是有限的,那么通過函數映射(hash與數組長取模)到其中的位置時,必然的會出現沖突,解決沖突辦法,就如同上圖所示,鏈表法。 優化性能的設計 HashMap設計時候需要考慮速度的問題,鏈表連接的越長性能就越差,極端的例子,退化成單鏈表,時間復雜度O(N),這樣就失去了快速訪問的特性。 如果為了速度最快,最好的辦法就是沒有鏈表,既然是通過取模的方式進行定位,要達到最少沖突,肯定需要很長的數組,而數組越長,就越容易浪費。 為了達到理想的效果,又不浪費太多的空間,hashmap使用了一個閥值,當對象的數量達到閥值,才會進行擴容,這樣就能夠保證浪費的空間是在可控的有限范圍內。通過調節閥值,可以使得鏈表的鏈接的節點盡量的少。 如何定義閥值?hashmap中用了負載因子這么個概念,用數組的容量*負載因子作為閥值,默認負載因子是0.75??梢宰孕姓{整,但是一般不建議,優化有時候是個很棘手的問題,不成熟的優化是所有罪惡之源,最好的策略就是置之不顧,直到你發現真正需要優化他。

其他集合的分析

基于散列的集合,除了HashMap外,常用的還有HashSet、LinkedHashSet、LinkedHashMap。而這三個都是在HashMap的基礎上進行改造的,只要明白了HashMap的原理,其他的非常容易清楚。 HashSet 我們來簡單分析下,在jdk中的源碼

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{ static final long serialVersionUID = -5024744406713321676L; PRivate transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); /** * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75). */ public HashSet() { map = new HashMap<>();//實例化時,同時實例化HashMap }

上面是摘抄HashSet源碼的一段,發現沒,這是組合,是代理,用hashMap進行代理,下面最后列舉下最常用的功能:

public boolean add(E e) { return map.put(e, PRESENT)==null; //PRESENT為常量 } public Iterator<E> iterator() { return map.keySet().iterator(); }

發了沒,是委托給HashMap的。 LinkedHashMap 估計 應該都知道,它既能擁有hashmap的速度,又能有序遍歷,直接看源碼:

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

發現沒,是繼承自HashMap,可以說,復用了大部分的HashMap功能。 思考 :它是如何在hashmap的基礎上進行改造,使的元素有序? 我們先看下面這幅圖: 這里寫圖片描述 大家應該都知道了,左邊的是hashmap的元素節點,而右邊的正是LinkedHashMap的元素節點。發現多了什么了嗎?2個指針,指向前驅和指向后繼。想下,如果每個元素都能夠知道后面是誰,從頭開始按照順序進行元素遍歷,這個還難嗎?看下面創造節點的代碼:

void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry<K,V> old = table[bucketIndex]; Entry<K,V> e = new Entry<>(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++; } private void addBefore(Entry<K,V> existingEntry) { after = existingEntry; before = existingEntry.before; //取前一個節點,對于header參數來說就是最后一個節點。 before.after = this; after.before = this; }

看見沒,createEntry比hashmap多了一個重定位指針的操作。header節點中保存有第二個和最后一個節點的指針(不懂看上圖),保證有序,只需要把現有最后一個節點的after 指向本節點,就保證新加入的元素是有序,現有最后一個節點可以通過header.before獲取,同時為了下一次新加入節點能正常有序,需要把header的前節點重新地位到新的最后一個節點(也就是說header.before指向新節點)。這樣再通過after指針就能順藤摸瓜,順序遍歷了。 LinkedHashSet 看源碼:

public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable {

好像和我們想象的不一樣,不應該是LinkedHashMap嗎?不急繼續看其構造函數

public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); } HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }

發現沒,HashSet這種構造方法用的是LinkedHashMap,現在還需要寫下去嗎,如同hashset復用hashMap原理一樣。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩久久精品成人| 欧美日韩综合视频| 国产亚洲福利一区| 亚洲第一天堂av| 不卡中文字幕av| 色多多国产成人永久免费网站| 欧美成人中文字幕| 精品一区二区三区电影| 欧美成人四级hd版| 亚洲资源在线看| 疯狂做受xxxx欧美肥白少妇| 欧美专区在线播放| 亚洲娇小xxxx欧美娇小| 少妇高潮 亚洲精品| 精品国产区一区二区三区在线观看| 国产剧情久久久久久| 亚洲天堂视频在线观看| 国产精品一区久久久| 欧美亚洲另类激情另类| 高清欧美性猛交xxxx| 亚洲91精品在线观看| 日本19禁啪啪免费观看www| 亚洲精品免费在线视频| 亚洲欧美日韩第一区| 日韩激情av在线免费观看| 亚洲天堂男人天堂女人天堂| 国产精品精品久久久| 97av在线影院| 一区二区三区黄色| 欧美性做爰毛片| 最好看的2019的中文字幕视频| 精品香蕉在线观看视频一| 日韩美女视频在线观看| 国产精品久久久久久久久| 国内精品久久久久影院 日本资源| 久久综合五月天| 久久99久久99精品中文字幕| 久久精品国产欧美亚洲人人爽| 5566日本婷婷色中文字幕97| 91色p视频在线| 98午夜经典影视| 成人日韩av在线| 日韩女优人人人人射在线视频| 国产成人黄色av| 91在线无精精品一区二区| 韩国视频理论视频久久| 疯狂做受xxxx高潮欧美日本| 中文字幕亚洲欧美日韩高清| 亚洲护士老师的毛茸茸最新章节| 91亚洲精品久久久久久久久久久久| 国产精品99免视看9| 久久久亚洲国产天美传媒修理工| 国产成人短视频| 国产91露脸中文字幕在线| 成人a免费视频| 欧美在线视频一区二区| 亚洲毛片一区二区| 国产午夜精品美女视频明星a级| 亚洲国产精品久久久久| 成年人精品视频| 国产成人精品午夜| 久久精品国产亚洲| 中文字幕自拍vr一区二区三区| 久久av中文字幕| 亚洲欧美日韩中文在线制服| 国产精品旅馆在线| 国产精品国产三级国产专播精品人| 亚洲男人天堂古典| 岛国av一区二区| 97香蕉久久夜色精品国产| 亚洲а∨天堂久久精品喷水| 国产精品激情av电影在线观看| 亚洲欧美综合图区| 亚洲性视频网站| 国产美女主播一区| 亚洲图片欧洲图片av| 亚洲综合最新在线| 国产精品美女在线观看| 国产亚洲精品激情久久| 久久久久一本一区二区青青蜜月| 色噜噜狠狠狠综合曰曰曰| 亚洲一二三在线| 日韩在线观看你懂的| 国产成人精品在线观看| 在线看日韩av| 亚洲社区在线观看| 日本中文字幕久久看| 欧美黄色性视频| 伊人伊成久久人综合网站| 国产不卡av在线| 国产综合香蕉五月婷在线| 国产日韩精品视频| 久久国产精品影视| 欧美国产高跟鞋裸体秀xxxhd| 国产成人免费av| 久久99久久99精品免观看粉嫩| 欧美性猛交xxxx乱大交| 欧美日韩精品在线视频| 精品久久久久人成| 欧美大片免费观看在线观看网站推荐| 成人免费大片黄在线播放| 久久久精品视频成人| 97在线视频免费| 日韩国产欧美精品在线| 2024亚洲男人天堂| 色噜噜狠狠狠综合曰曰曰88av| 亚洲视频日韩精品| 亚洲色图在线观看| 91国产视频在线播放| 国产精品男女猛烈高潮激情| 麻豆成人在线看| 国产视频福利一区| 精品国产电影一区| 综合国产在线视频| 国产精品日日做人人爱| 久久婷婷国产麻豆91天堂| 亚洲国产成人爱av在线播放| 在线观看成人黄色| 国产精品欧美一区二区| 国产成人精品亚洲精品| 日韩精品免费一线在线观看| 97久久精品人搡人人玩| 午夜精品一区二区三区av| 久久理论片午夜琪琪电影网| 日韩综合中文字幕| 欧美老肥婆性猛交视频| 欧美中文字幕视频| 亚洲一区二区三区777| 美女精品久久久| 91综合免费在线| 国产亚洲精品久久久| 欧美与欧洲交xxxx免费观看| 国产在线视频2019最新视频| 欧美激情视频在线免费观看 欧美视频免费一| 久久成人综合视频| 日本精品一区二区三区在线| 日韩精品免费在线视频观看| 国产在线999| 亚洲国产第一页| zzijzzij亚洲日本成熟少妇| 欧美日韩精品在线播放| 国产日本欧美在线观看| 伊人一区二区三区久久精品| 免费91在线视频| 国产一区二区动漫| 国产日本欧美一区二区三区在线| 国产视频自拍一区| 亚洲最新av在线| 日韩av在线影视| 三级精品视频久久久久| 亚洲精品美女免费| 亚洲人成网站777色婷婷| 日韩国产欧美区| 欧美成人精品在线| 在线视频精品一| 久久影院资源网| 最近免费中文字幕视频2019| 亚洲激情中文字幕| 成人免费福利视频| 国产亚洲美女久久| 欧美精品18videos性欧美| 亚洲人成电影在线播放| 狠狠躁夜夜躁人人爽超碰91| 亚洲爱爱爱爱爱|