精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java HashMap實例源碼分析

開發 后端
Entry是Map接口中的一個內部接口,它是實現鍵值對存儲關鍵。在HashMap中,有Entry的實現類,叫做Entry。Entry類很簡 單,里面包含key,value,由外部引入的hash,還有指向下一個Entry對象的引用,和數據結構中學的鏈表中的note節點很類似。

引言

HashMap在鍵值對存儲中被經常使用,那么它到底是如何實現鍵值存儲的呢?

一 Entry

Entry是Map接口中的一個內部接口,它是實現鍵值對存儲關鍵。在HashMap中,有Entry的實現類,叫做Entry。Entry類很簡 單,里面包含key,value,由外部引入的hash,還有指向下一個Entry對象的引用,和數據結構中學的鏈表中的note節點很類似。

Entry類的屬性和構造函數:

  1. final K key; 
  2. V value; 
  3. Entry<K,V> next; 
  4. int hash; 
  5. /** 
  6. * Creates new entry. 
  7. */ 
  8. Entry(int h, K k, V v, Entry<K,V> n) { 
  9. value = v; 
  10. next = n; 
  11. key = k; 
  12. hash = h; 

二 HashMap的初始化

  1. //HashMap構造方法 
  2. public HashMap(int initialCapacity, float loadFactor) { 
  3. if (initialCapacity < 0
  4.   throw new IllegalArgumentException("Illegal initial capacity: " + 
  5.              initialCapacity); 
  6. if (initialCapacity > MAXIMUM_CAPACITY) 
  7.   initialCapacity = MAXIMUM_CAPACITY; 
  8. if (loadFactor <= 0 || Float.isNaN(loadFactor)) 
  9.   throw new IllegalArgumentException("Illegal load factor: " + 
  10.              loadFactor); 
  11. this.loadFactor = loadFactor; 
  12. threshold = initialCapacity; 
  13. init(); 

這是HashMap的構造函數之一,其他構造函數都引用這個構造函數進行初始化。參數InitialCapacity指的是HashMap中 table數組最初的大小,參數loadFactory指的是HashMap可容納鍵值對與數組長度的比值(舉個例子:數組長度默認值為 16,loadFactory默認值為0.75,如果HashMap中存儲的鍵值對即Entry多于12,則會進行擴容,擴容后大小為當前數組長度的2 倍)。在構造函數中不會對數組進行初始化,只有在put等操作方法內會進行判斷是否要初始化或擴容。

三 table數組

在HashMap中有一個概念叫做threshold(實際可容納量),實際可容納量指的是在HashMap中允許存在最多的Entry的個數,它 是由HashMap中內置的數組table的長度*load factory(負載因子)得來。其作用是保證HashMap的效率。

table數組是HashMap實現鍵值對存儲的又一關鍵,具體鍵值對是怎么存的呢?請看下圖

JAVA HashMap源碼淺析

如圖中的[key,value]就是Entry對象來實現的,而table數組是用來存放Entry對象的。

//數組的初始化:

  1. private static int roundUpToPowerOf2(int number) { 
  2. return number >= MAXIMUM_CAPACITY 
  3.    ? MAXIMUM_CAPACITY 
  4.    : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1
  5. private void inflateTable(int toSize) { 
  6. // Find a power of 2 >= toSize 
  7. int capacity = roundUpToPowerOf2(toSize); 
  8. threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1); 
  9. table = new Entry[capacity]; 
  10. initHashSeedAsNeeded(capacity); 

在put等方法中發現數組未進行初始化時會調用InflateTable方法進行初始化,輸入參數為初始設置的InitialCapacity,實 際上他會調用roundUpToPowerOf2方法返回一個比初始容量大的最小的2的冪數(其中一個原因是在得到Entry所在數組位置時方便)。

四 put方法

  1. public V put(K key, V value) { 
  2. if (table == EMPTY_TABLE) { 
  3.   inflateTable(threshold); 
  4. if (key == null
  5.   return putForNullKey(value); 
  6. int hash = hash(key); 
  7. int i = indexFor(hash, table.length); 
  8. for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
  9.   Object k; 
  10.   if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
  11.    V oldValue = e.value; 
  12.    e.value = value; 
  13.    e.recordAccess(this); 
  14.    return oldValue; 
  15.   } 
  16. modCount++; 
  17. addEntry(hash, key, value, i); 
  18. return null
  19. private V putForNullKey(V value) { 
  20. for (Entry<K,V> e = table[0]; e != null; e = e.next) { 
  21.   if (e.key == null) { 
  22.    V oldValue = e.value; 
  23.    e.value = value; 
  24.    e.recordAccess(this); 
  25.    return oldValue; 
  26.   } 
  27. modCount++; 
  28. addEntry(0null, value, 0); 
  29. return null
  30. void addEntry(int hash, K key, V value, int bucketIndex) { 
  31. if ((size >= threshold) && (null != table[bucketIndex])) { 
  32.   resize(2 * table.length); 
  33.   hash = (null != key) ? hash(key) : 0
  34.   bucketIndex = indexFor(hash, table.length); 
  35. createEntry(hash, key, value, bucketIndex); 
  36. void createEntry(int hash, K key, V value, int bucketIndex) { 
  37. Entry<K,V> e = table[bucketIndex]; 
  38. table[bucketIndex] = new Entry<>(hash, key, value, e); 
  39. size++; 

在put方法中

1. 首先會判斷數組是否為空,如果為空會對數組進行初始化。

2. 接下來判斷key是否為null,如果為null就采用第二個方法對鍵值對進行put。

3. 接下來對key進行hash得到一個數值,再對這個數值進行處理(IndexFor方法)得到所在數組中的位置。

4. 接下來會遍歷所在數組位置的鏈表,如果key的hash和傳入key的hash相同且(key內存地址相等 或 equals方法相等),則意味著會更新在鏈表中的value值,并返回舊的value值。

5. 如果上邊的方法都沒有奏效,則會調用第三個方法,創建一個新的Entry對象。

在putForNullKey方法中 ,我們看到它是為了NULL值專門設置的,NULL值的hash始終為0,所以key為NULL的Entry對象肯定在數組的第0個位置。同樣,如果找到則更新,沒有找到則添加。

調用addEntry方法 意味著要往這個數組鏈表中添加一個Entry,所以會在最開始判斷已經存在的Entry數量是否超過了實際可容納量。如果超過了,則會調用resize方 法將數組擴大兩倍,注意在擴大之后會對已經存入的Entry進行重排,原因是當初存入時IndexFor方法與數組長度有關系。接著會調用第四個方法。

createEntry方法 很簡單,就是將原本在數組中存放的鏈表頭置入到新的Entry之后,將新的Entry放入數組中。從這里我們可以看出HashMap不保證順序問題。

get方法和contains方法原理和put方法一致,即先通過對key的hash得到其value值所在的鏈表頭在數組中的位置,再通過equals方法判斷value是否存在。

五 其他

  1. //hash方法 
  2. final int hash(Object k) { 
  3. int h = hashSeed; 
  4. if (0 != h && k instanceof String) { 
  5.   return sun.misc.Hashing.stringHash32((String) k); 
  6. h ^= k.hashCode(); 
  7. // This function ensures that hashCodes that differ only by 
  8. // constant multiples at each bit position have a bounded 
  9. // number of collisions (approximately 8 at default load factor). 
  10. h ^= (h >>> 20) ^ (h >>> 12); 
  11. return h ^ (h >>> 7) ^ (h >>> 4); 

hash方法中最終返回值與key的hashCode方法有關。

總結

  1. 最終數組初始化的容量大小會是大于等于你傳入初始容量的最小2的冪數。

  2. key為null或value為null能存入HashMap的原因是對null值會進行單獨的操作。

  3. 在table數組中的鏈表中每個Entry的共同點是key的hash(key.hashCode)部分相同。

  4. 注意對key的hashCode和equals方法的重寫當你想讓兩個key映射一個對象,因為判定key相等的條件是(hashCode相等+(內存相等 或 equals相等))。

  5. 最早存入的鍵值對會在鏈表的末端。

  6. 當數組沒有鏈表存在時,HashMap性能***為O(1)。而最差為O(threshould)。

 

責任編輯:王雪燕 來源: segmentfault
相關推薦

2015-06-15 10:32:44

Java核心源碼解讀

2020-10-30 08:35:23

Java Virtua

2023-09-12 07:31:45

HashMap線程

2020-07-28 08:54:39

內核通信Netlink

2016-09-12 14:33:20

javaHashMap

2015-09-11 09:17:55

JavaJava HashMa

2012-03-15 17:18:33

JavaHashMap

2012-03-15 16:27:13

JavaHashMap

2012-03-15 16:12:57

JavaHashMap

2013-04-03 15:45:51

Android瀑布流android_wat

2011-03-15 10:09:11

2013-07-02 14:33:35

JavaClass

2015-09-06 08:59:52

Java延時實例

2014-08-26 11:11:57

AsyncHttpCl源碼分析

2011-03-15 11:33:18

iptables

2023-03-15 21:46:17

中間件Java網絡編程

2020-07-09 07:00:00

HashMap

2015-11-16 11:22:05

Java對象內存分配

2020-11-20 14:02:22

HashMap遍歷Java

2011-05-26 10:05:48

MongoDB
點贊
收藏

51CTO技術棧公眾號

在线看成人av| 97国产精东麻豆人妻电影| 中国黄色一级视频| 91精品啪在线观看国产81旧版| 337p亚洲精品色噜噜噜| 日本a在线天堂| 欧美在线观看在线观看| 视频在线在亚洲| 欧美成人精品不卡视频在线观看| 亚洲啪av永久无码精品放毛片| xx欧美视频| 自拍偷自拍亚洲精品播放| 91亚洲人电影| 久久久久久在线观看| 午夜影院欧美| 亚洲欧美国产日韩天堂区| 成人不卡免费视频| www在线观看黄色| 久久久国产精品午夜一区ai换脸| 91精品国产99久久久久久红楼| 久草手机在线视频| 欧美va天堂在线| 中文亚洲视频在线| 岛国精品一区二区三区| 日日夜夜一区| 色美美综合视频| 丁香六月激情婷婷| 免费av不卡| 久久色在线观看| 国产美女精品在线观看| 在线观看中文字幕网站| 亚洲综合国产| 性欧美xxxx交| 欧美日韩黄色网| 成人91在线| 日韩精品高清在线| 欧美国产日韩在线视频| 色猫猫成人app| 欧美午夜女人视频在线| 美女av免费观看| 毛片av在线| 中文字幕国产精品一区二区| 久久久综合亚洲91久久98| 精品人妻一区二区三区四区不卡| 久久超碰97中文字幕| 国产精欧美一区二区三区| 日本熟妇毛茸茸丰满| 欧美精品三级| 欧美国产日韩在线| 真实国产乱子伦对白在线| 91欧美国产| 精品国内自产拍在线观看| 欧美性受xxxx黑人| 成人免费在线观看av| 亚洲最大中文字幕| 免费黄色片网站| 精品国产99| 国产亚洲精品综合一区91| av电影网站在线观看| 一区二区小说| 中文字幕亚洲欧美| 麻豆一区在线观看| 国产精品国产一区| 久久国产精品免费视频| 欧美日韩成人免费观看| 欧美日韩中文| 91国产美女视频| 天码人妻一区二区三区在线看| 久久aⅴ国产紧身牛仔裤| 日本精品免费一区二区三区| 无码人妻aⅴ一区二区三区有奶水| 先锋亚洲精品| 国产精品私拍pans大尺度在线| 中文字幕人妻精品一区| 久久国产精品露脸对白| 亚洲伊人久久综合| 国精产品乱码一区一区三区四区| 成a人片亚洲日本久久| 久久国产精品久久| 国产小视频免费在线网址| 国产亚洲成aⅴ人片在线观看| 日韩av一区二区三区在线| 1769在线观看| 一区二区三区在线视频免费| 日韩欧美国产综合在线| 成人看片网页| 欧美一区二区三区日韩| 免费无码一区二区三区| 精品久久久久久久久久久下田| 日韩在线观看你懂的| 精品无码久久久久久久| 小嫩嫩精品导航| 91精品久久久久久久久| 人妻中文字幕一区| 国产日韩欧美激情| 日本xxx免费| 亚洲啊v在线| 4438x成人网最大色成网站| 国产伦精品一区二区三区精品 | 91福利入口| 视频一区二区三区国产| 中文字幕日本乱码精品影院| 欧美一级视频免费看| 欧美成人aaa| 亚洲国产中文字幕久久网 | 亚洲免费成人av| 国产极品粉嫩福利姬萌白酱| 成人免费观看49www在线观看| 日韩国产欧美精品一区二区三区| 蜜桃av.com| 亚洲欧美清纯在线制服| 亚洲a∨日韩av高清在线观看| 欧美一区二区少妇| 一区二区三区高清在线| 亚洲第一狼人区| 欧美激情99| 久久久成人av| 免费视频网站在线观看入口| 成人永久免费视频| 在线国产99| 天天综合网天天| 亚洲国产成人久久综合一区| 波多野结衣家庭教师| 免费视频一区| 国产在线一区二区三区欧美| 2021国产在线| 欧美日韩一卡二卡三卡| 中文字幕av网址| 亚洲日韩视频| 99影视tv| 婷婷色在线资源| 欧美人与禽zozo性伦| 真实乱视频国产免费观看| 亚洲激情网址| av成人在线电影| 1024在线播放| 9191久久久久久久久久久| 国产黄色三级网站| 国产精品二区影院| 91久久精品一区二区别| 二区在线播放| 正在播放亚洲一区| 久久人妻无码aⅴ毛片a片app| 人人狠狠综合久久亚洲| 日本一区二区精品视频| 小黄鸭精品aⅴ导航网站入口| 亚洲精品国产精品自产a区红杏吧| 久久久久人妻一区精品色欧美| 国产精品一区二区x88av| 四虎影院一区二区| 亚洲伊人精品酒店| 久久精品男人天堂| 国产口爆吞精一区二区| 中文字幕亚洲电影| 在线视频观看一区二区| 亚洲一级淫片| 亚洲在线视频福利| 青青草原av在线| 日韩精品一区二区三区视频在线观看| 欧美高清视频一区二区三区| 国产黄人亚洲片| 免费人成自慰网站| 久久香蕉网站| 国产成人免费91av在线| eeuss影院www在线播放| 欧美日韩国产精选| 国产免费美女视频| 丰满岳乱妇一区二区三区| 成人免费毛片在线观看| 婷婷成人影院| 国产精品自产拍在线观| 二区三区在线观看| 亚洲福利精品在线| 亚洲视频 欧美视频| 欧美国产日韩a欧美在线观看| 手机av在线网| 欧美日本精品| 免费av在线一区二区| 国产成人精选| 久久久免费观看视频| 欧美zozo| 制服视频三区第一页精品| 国产污视频在线观看| 久久久久久久免费视频了| 国产精品一区二区小说| 欧美激情日韩| 欧美下载看逼逼| 高清一区二区三区av| 久久久久久久999精品视频| 国产在线三区| 日韩美女视频在线| av毛片在线免费观看| 亚洲色图视频免费播放| 亚洲国产精品无码久久久久高潮| 日韩二区三区四区| av一区二区三区免费观看| 在线成人动漫av| 亚洲综合中文字幕在线| 依依综合在线| 欧美成人午夜视频| 一本综合久久| 97精品久久久中文字幕免费| 黄色美女网站在线观看| 制服丝袜亚洲播放| 在线观看日本视频| 亚洲欧美日韩国产手机在线| aa一级黄色片| 国产乱妇无码大片在线观看| 日本女优爱爱视频| 欧美69视频| 亚洲精品日韩精品| 欧美巨大xxxx| 999热视频| 国产成人午夜性a一级毛片| 国外视频精品毛片| 国产一二区在线| 国产一区二区三区三区在线观看| 精品久久久久成人码免费动漫| 在线一区二区视频| 日韩在线观看第一页| 亚洲欧美自拍偷拍色图| 亚洲永久精品ww.7491进入| 成人一道本在线| www.欧美激情.com| 视频一区国产视频| 久色视频在线播放| 欧美先锋影音| 国产一区二区三区在线免费| 日韩专区精品| 天堂精品一区二区三区| 色综合综合网| 久久久久se| 看全色黄大色大片免费久久久| 亚洲xxxxx性| 国产精品毛片无码| 91精品在线国产| 激情小说亚洲| 国产精品稀缺呦系列在线| 亚洲四虎影院| 国产不卡av在线| 日韩av大片站长工具| 日本一区二区三区四区视频| 两个人看的在线视频www| 久久久综合av| caoprom在线| 国色天香2019中文字幕在线观看| 变态调教一区二区三区| 欧美极品美女视频网站在线观看免费 | 欧美男男激情videos| 91tv亚洲精品香蕉国产一区7ujn| 九色91在线| 国产做受高潮69| www.综合网.com| 久久久最新网址| 在线观看网站免费入口在线观看国内 | 极品美女销魂一区二区三区免费| 岛国毛片在线播放| 极品销魂美女一区二区三区| 第一区免费在线观看| 久久99精品久久久久| www.污污视频| 国产高清无密码一区二区三区| 色综合久久久无码中文字幕波多| 国产成人免费视频精品含羞草妖精| 亚洲天堂小视频| 成人久久18免费网站麻豆| 亚洲男人在线天堂| 久久久久久久综合狠狠综合| 青青青视频在线播放| 亚洲欧美国产三级| 国产稀缺真实呦乱在线| 午夜欧美在线一二页| 9i看片成人免费看片| 欧美色大人视频| 精品人妻一区二区三区麻豆91| 日韩成人在线网站| 九一国产在线| 久久不射电影网| 123区在线| 国产精品久久久久影院日本| 亚洲色图图片| 久久国产精品精品国产色婷婷| 欧美色网址大全| 日韩免费在线观看av| 亚洲一区自拍| 国产一级免费大片| 91蜜桃在线观看| 在线视频这里只有精品| 亚洲成人激情综合网| 欧美视频xxxx| 精品免费日韩av| av在线免费观看网站| 欧美日韩国产第一页| 免费观看一级欧美片| 国产欧美在线观看| 欧美jizz19性欧美| 中文字幕不卡每日更新1区2区| 亚洲另类自拍| 五月天开心婷婷| 久久亚洲一级片| 欧美精品色哟哟| 欧美日韩中字一区| 四虎精品一区二区三区| 日韩一区二区三区xxxx| 中国色在线日|韩| 亚洲字幕在线观看| 精品国精品国产自在久国产应用| 欧美日韩福利在线| 久久精品国产精品亚洲精品| 亚洲男人在线天堂| 亚洲在线成人精品| 91麻豆一区二区| 亚洲视频在线观看免费| 2018av在线| 不卡视频一区二区| 国产精品传媒精东影业在线| 国产女女做受ⅹxx高潮| 成人一级黄色片| 特级片在线观看| 欧美福利视频一区| 都市激情一区| 日本一欧美一欧美一亚洲视频| 久久香蕉精品香蕉| av在线com| 国产精品一区二区无线| 国产第一页精品| 在线亚洲一区二区| 欧美午夜黄色| 国色天香2019中文字幕在线观看| 日韩激情精品| 男女h黄动漫啪啪无遮挡软件| 蜜桃视频一区二区三区在线观看| www.自拍偷拍| 一本久久a久久精品亚洲| 手机看片一区二区| 国内偷自视频区视频综合| 粉嫩久久久久久久极品| 无码人妻精品一区二区蜜桃百度| 韩日av一区二区| frxxee中国xxx麻豆hd| 欧美亚洲国产一区二区三区va| 免费看男男www网站入口在线| 欧美亚洲在线观看| 日韩丝袜视频| 波多野结衣家庭教师视频| 91免费精品国自产拍在线不卡| 国产精品免费av一区二区| 亚洲福利小视频| 麻豆mv在线看| 蜜桃av噜噜一区二区三| 久久精品一本| 人妻一区二区视频| 欧美亚男人的天堂| 91caoporm在线视频| 成人激情电影一区二区| 91精品99| 伊人久久久久久久久| 亚州成人在线电影| 涩涩视频在线观看免费| 国产成人精品免高潮在线观看| 精品久久91| 91性高潮久久久久久久| 亚洲综合999| 午夜av免费观看| 日韩美女免费观看| 日韩成人影院| 精品人妻一区二区三区免费| 婷婷久久综合九色综合伊人色| 蜜桃视频在线观看网站| 国产精品欧美风情| 一区二区三区在线电影| 亚洲精品国产成人av在线| 色综合天天狠狠| 久操视频在线观看| 国产成人精品日本亚洲11| 亚洲欧美成人| 日韩在线观看免| 在线看成人av电影| 91精品蜜臀一区二区三区在线| 日韩欧美中文视频| 午夜精品福利一区二区三区av| 青青草免费在线| 国产欧美日韩丝袜精品一区| 欧美+日本+国产+在线a∨观看| av网页在线观看| 在线视频一区二区免费| 福利视频在线| 快播日韩欧美| 欧美aa在线视频| 成年人一级黄色片| 亚洲第一精品夜夜躁人人爽 | 国产精品成人播放| 亚洲综合中文| 亚洲人成人无码网www国产| 91精品国产综合久久小美女| 国产在线美女| 97超碰免费观看| 久久久不卡影院| 亚洲AV无码乱码国产精品牛牛| 日韩免费在线看|