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

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

基于散列的集合簡析

2019-11-10 16:59:22
字體:
來源:轉載
供稿:網友

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
欧美日韩国产综合视频在线观看中文| 欧美视频专区一二在线观看| 亚洲缚视频在线观看| 91精品中文在线| 日韩精品极品在线观看播放免费视频| 成人xvideos免费视频| 欧美一区二区.| 久久久久国产精品免费网站| 91青草视频久久| 欧美诱惑福利视频| 亚洲mm色国产网站| 日韩免费电影在线观看| 91精品国产沙发| 国产成+人+综合+亚洲欧洲| 亚洲精品视频播放| 成人免费淫片aa视频免费| 精品成人久久av| 成人做爽爽免费视频| 亚洲淫片在线视频| 欧美性少妇18aaaa视频| 成人免费在线视频网站| 久久成人18免费网站| 亚洲a在线播放| 亚洲人高潮女人毛茸茸| 欧美体内谢she精2性欧美| 国内伊人久久久久久网站视频| 国产成人高清激情视频在线观看| 亚洲日本欧美中文幕| 精品香蕉在线观看视频一| 在线播放国产一区中文字幕剧情欧美| 欧美色图在线视频| 国产精品视频男人的天堂| 亚洲国产精品久久久久| 国产精品成人av在线| 欧美性猛交xxxx乱大交蜜桃| 久久精品男人天堂| 久久91精品国产| www国产精品com| 国产偷国产偷亚洲清高网站| 久久久精品久久久久| 国模精品一区二区三区色天香| 九九热最新视频//这里只有精品| 日韩欧美有码在线| 亚洲第一精品夜夜躁人人躁| 久久激情视频免费观看| 日韩成人av在线播放| 欧美精品在线网站| 91久久精品日日躁夜夜躁国产| 日韩成人久久久| 国内外成人免费激情在线视频| 中文字幕亚洲欧美一区二区三区| 91丝袜美腿美女视频网站| 亚洲qvod图片区电影| 国产精品久久久久久av福利| 亚洲成年人在线播放| 亚洲一区二区三区毛片| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久国产精品亚洲一区| 最近免费中文字幕视频2019| 久久精品国产亚洲精品2020| 91中文字幕在线| 亚洲第一区第一页| 亚洲国产美女久久久久| 成人观看高清在线观看免费| 欧美日韩免费观看中文| 日韩电影免费在线观看中文字幕| 97在线观看免费| 亚洲a中文字幕| 中日韩午夜理伦电影免费| 欧美中文字幕在线观看| 色七七影院综合| 欧美床上激情在线观看| 亚洲色图偷窥自拍| 91夜夜未满十八勿入爽爽影院| 中文字幕欧美国内| 成人黄色片网站| 久久精品中文字幕免费mv| 欧美激情三级免费| 2020久久国产精品| 国内偷自视频区视频综合| 久久中文字幕一区| 91国产精品视频在线| 国内精品久久久久影院优| 丝袜美腿亚洲一区二区| 成人免费淫片视频软件| 国产精品亚洲视频在线观看| 欧美裸体男粗大视频在线观看| 成人精品aaaa网站| 久久久亚洲国产| 懂色av中文一区二区三区天美| 国产精品日韩在线一区| 日韩视频在线一区| 欧美精品一二区| 日韩中文字幕在线观看| 国产aⅴ夜夜欢一区二区三区| 深夜福利国产精品| 91精品国产综合久久香蕉的用户体验| 亚洲精品一区久久久久久| 日韩av片电影专区| 日本一区二区三区在线播放| 日韩电视剧在线观看免费网站| 黑人巨大精品欧美一区二区免费| 亚洲综合在线做性| 亚洲色图综合网| 精品国产成人av| 日韩电影免费观看中文字幕| 久久久精品影院| 久久久久久18| 精品一区二区三区四区在线| 欧美激情一级精品国产| 亚洲国产精品嫩草影院久久| 国产狼人综合免费视频| 国产精品v片在线观看不卡| 欧美性jizz18性欧美| 91视频国产高清| 日韩在线视频免费观看高清中文| 亚洲影院色在线观看免费| 色无极影院亚洲| 亚洲综合中文字幕在线观看| 91精品视频一区| 91精品视频专区| 羞羞色国产精品| 亚洲人在线视频| 久久精品在线播放| 欧美精品做受xxx性少妇| 亚洲综合在线播放| 国产伊人精品在线| 欧美激情免费观看| 国产日韩综合一区二区性色av| 黑人巨大精品欧美一区二区| 国产91精品青草社区| 亚洲激情视频在线观看| 国产精品旅馆在线| 欧美成人国产va精品日本一级| 亚洲黄色有码视频| 国产精品国产自产拍高清av水多| 亚洲欧洲一区二区三区久久| 久久精品视频亚洲| 国产精品99久久久久久久久久久久| 欧洲亚洲免费在线| 欧美激情亚洲综合一区| 久久精品视频99| 欧美黄色片在线观看| 国产成人精品免高潮费视频| 日韩在线视频导航| 永久免费精品影视网站| 777777777亚洲妇女| 亚洲国产日韩精品在线| 成人网页在线免费观看| 欧美激情a∨在线视频播放| 亚洲人成电影网站色| 欧美色视频日本高清在线观看| 国产精品久久久久久久一区探花| 欧美精品18videos性欧美| 日韩av在线免费观看一区| 国产午夜精品视频免费不卡69堂| 国产精品自拍小视频| 最近2019中文免费高清视频观看www99| 亚洲午夜精品久久久久久久久久久久| 久久精品成人欧美大片| 国产91精品视频在线观看| 黑人巨大精品欧美一区免费视频| 欧美激情在线狂野欧美精品| 久久精品国产免费观看|