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

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

HashMap

2019-11-14 08:50:14
字體:
來源:轉載
供稿:網友

HashMap繼承于AbstractMap,實現了Map接口,同時標記了Cloneable和Serializable接口。

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

構造函數

HashMap提供了四個構造函數: (1) HashMap():構造一個初始容量為16和加載因子為0.75的空HashMap。 (2) HashMap(int initialCapacity):構造一個帶指定初始容量和默認加載因子0.75的空HashMap。 (3) HashMap(int initialCapacity, float loadFactor):構造一個帶指定初始容量和指定加載因子的空HashMap。 (4) HashMap(Map

public HashMap(Map<? extends K, ? extends V> m) { this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR); inflateTable(threshold); putAllForCreate(m); } PRivate void inflateTable(int toSize) { // Find a power of 2 >= toSize,計算出大于toSize的最小的2的n次方值。 int capacity = roundUpToPowerOf2(toSize); // 設置HashMap的容量極限,當HashMap的容量達到該極限時就會進行擴容操作 threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1); // 初始化table數組 table = new Entry[capacity]; // Initialize the hashing mask value. We defer initialization until we really need it. initHashSeedAsNeeded(capacity); }

初始容量是創建哈希表時的桶的數量, 加載因子是哈希表容量擴展前可以達到多滿的一種尺度,它衡量的是一個散列表的空間的使用程度。負載因子越大,表示散列表的裝填程度越高、對空間的利用更充分,后果卻是查找效率的降低;而負載因子太小,那么散列表的數據將過于稀疏,對空間的利用存在著浪費。

數據結構

數據結構

從構造函數中可以看出,HashMap本質是一個table數組,table數組里的元素是Entry鏈表。Entry為HashMap的內部類,它包含了鍵key、值value、下一個節點next以及hash值,正是由于Entry才構成了table數組的項為鏈表。

static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } // 部分源碼略去

put(K key, V value)

put(K key, V value)方法的源碼如下?;具^程是: 1. 判斷key是否為null,若為null,則直接調用putForNullKey方法。 2. key不為空則計算key的hash值,再根據hash值搜索key落在哪個桶上。 3. 對該桶上的Entry鏈表進行遍歷,如果該鏈表上存在相同的key,則覆蓋原來key的value,否則將該元素保存在鏈頭(最先保存的元素放在鏈尾)。

public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } // 當key為null,調用putForNullKey方法,保存null到table的第一個位置,這就是HashMap允許為null的原因 if (key == null) return putForNullKey(value); // 計算key的hash值 int hash = hash(key); // 計算key的hash值在table數組中的位置,即落在哪一個桶上 int i = indexFor(hash, table.length); // 迭代該桶上的Entry鏈表,找到key保存的位置 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; // 判斷該鏈表上是否有相同的hash值和相同的key(僅僅判斷hash值是否相同是不夠的) if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { // 若存在相同,則直接覆蓋value,返回舊value V oldValue = e.value; e.value = value; e.recordaccess(this); return oldValue; } } //修改次數增加1 modCount++; // 該鏈表上不存在相同的hash值和key,則將key、value添加至i位置處 addEntry(hash, key, value, i); return null; }

以上的存儲機制也解釋了HashSet是如何保證元素唯一性的。

這里需要強調下indexFor方法。HashMap就是通過該方法實現均勻分布table數據和充分利用空間的。初始化時,我們保證了capacity是大于初始容量的最小的2的n次方值。當length = 2^n時,不同的hash值發生碰撞的概率比較小,從而數據在table數組中分布較均勻,查詢速度也較快。

/** * Returns index for hash code h. */ static int indexFor(int h, int length) { // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2"; return h & (length-1); }

最后看一下鏈的產生和擴容問題。 1. 鏈的產生:系統總是將新創建的Entry放入bucketIndex索引處。如果bucketIndex處已經有了對象,那么新添加的Entry對象將指向原有的Entry對象,形成一條Entry鏈;如果bucketIndex處還沒有Entry對象,那么新添加的Entry對象將指向null。在table數組未擴容的情況下,兩個元素的hash值相同,就意味著它們會在同一個桶上。 2. 擴容問題:當HashMap中元素的數量等于table數組長度*加載因子,就會觸發擴容操作。擴容操作需盡量避免,因為它需要重新計算這些元素在新table數組中的位置并進行復制處理。

void addEntry(int hash, K key, V value, int bucketIndex) { // 若HashMap中元素的個數超過極限了,則容量擴大兩倍 if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table.length); hash = (null != key) ? hash(key) : 0; bucketIndex = indexFor(hash, table.length); } createEntry(hash, key, value, bucketIndex); } void createEntry(int hash, K key, V value, int bucketIndex) { // 獲取bucketIndex處的Entry Entry<K,V> e = table[bucketIndex]; // 將新創建的Entry放入bucketIndex索引處,并讓新的Entry指向原來的Entry e table[bucketIndex] = new Entry<>(hash, key, value, e); size++; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019好看的中文字幕免费| 欧美亚洲午夜视频在线观看| 91亚洲精品在线| 国产99久久精品一区二区 夜夜躁日日躁| 国产综合在线视频| 26uuu亚洲国产精品| 精品成人久久av| 久久亚洲精品一区| 日韩国产精品一区| 岛国av一区二区在线在线观看| 亚洲欧美日韩一区二区在线| 福利一区福利二区微拍刺激| 91精品久久久久久久久中文字幕| 久久99精品久久久久久噜噜| 亚洲最大成人免费视频| 欧美激情一区二区三级高清视频| 一本色道久久88综合日韩精品| 日韩有码在线观看| 欧美成人午夜免费视在线看片| 亚洲免费伊人电影在线观看av| 亚洲va码欧洲m码| 亚洲日本中文字幕免费在线不卡| 国产成人精品优优av| 精品在线观看国产| 在线观看久久av| 一本一道久久a久久精品逆3p| 中文字幕亚洲激情| 68精品久久久久久欧美| www.日韩不卡电影av| 久久久女人电视剧免费播放下载| 美女av一区二区三区| 国产精品成熟老女人| 黑丝美女久久久| 欧美日韩一区二区三区在线免费观看| 91精品视频免费看| 亚洲福利视频专区| 亚洲成人a级网| 在线亚洲男人天堂| 欧美精品video| 亚洲人成网站色ww在线| 精品久久在线播放| 91高潮精品免费porn| 91精品国产综合久久久久久蜜臀| 91精品国产沙发| 欧美大尺度电影在线观看| 国产精品美女无圣光视频| xxxx欧美18另类的高清| 91精品啪在线观看麻豆免费| 中文字幕欧美日韩| 国产亚洲一区精品| 国产在线视频不卡| 国产精品色婷婷视频| 色综合色综合网色综合| 国内精品美女av在线播放| 日韩精品视频免费在线观看| 高清日韩电视剧大全免费播放在线观看| 欧美激情精品久久久久久| 日韩精品一区二区视频| 国产香蕉精品视频一区二区三区| 日韩麻豆第一页| 久久777国产线看观看精品| 国产精品久久久av久久久| 久久91精品国产91久久久| 欧美极品美女电影一区| 色婷婷亚洲mv天堂mv在影片| 91精品国产沙发| 亚洲人成电影网站色www| 欧美性生活大片免费观看网址| 亚洲国产精久久久久久久| 中文字幕av日韩| 亚洲 日韩 国产第一| 亚洲性线免费观看视频成熟| 一本色道久久88综合亚洲精品ⅰ| 国内伊人久久久久久网站视频| 午夜精品久久久久久99热软件| 欧美成人免费大片| 亚洲最大av网站| 日韩av一卡二卡| 欧美精品成人在线| 欧美乱大交xxxxx另类电影| 日韩免费观看高清| 亚洲成avwww人| 久久国产视频网站| 国产mv免费观看入口亚洲| 欧美成人午夜剧场免费观看| 福利视频导航一区| 欧美在线亚洲一区| 色综合色综合网色综合| 日本一区二三区好的精华液| 欧美亚洲国产视频小说| 亚洲在线视频观看| 欧美国产日产韩国视频| 久久久久久久久久久免费| 日韩欧美中文字幕在线观看| 91久热免费在线视频| 91精品国产综合久久香蕉| 国内成人精品视频| 一道本无吗dⅴd在线播放一区| 高清欧美性猛交xxxx| 亚洲影院污污.| 中文字幕视频一区二区在线有码| 亚洲成年网站在线观看| 久久国产色av| 国产日韩精品综合网站| 欧美刺激性大交免费视频| 国产区亚洲区欧美区| 欧美日韩一区二区三区| 青青草国产精品一区二区| 久久精品夜夜夜夜夜久久| 亚洲男人天堂网站| 国产日韩欧美另类| 97色在线视频| 亚洲无限av看| 51ⅴ精品国产91久久久久久| 奇米一区二区三区四区久久| 欧美一区二区大胆人体摄影专业网站| 成人性生交xxxxx网站| 久久亚洲精品视频| 欧美整片在线观看| 久久久久国产精品免费网站| 欧美美女15p| 日韩中文字幕视频在线观看| 91av在线播放视频| 亚洲精品久久久久久久久久久久| 亚洲性视频网站| 97精品伊人久久久大香线蕉| 色无极亚洲影院| 国模叶桐国产精品一区| 亚洲第一网站男人都懂| 国产日韩精品在线| 萌白酱国产一区二区| 一区二区三区回区在观看免费视频| 久久久久久久久网站| 亚洲国产成人精品一区二区| 91夜夜揉人人捏人人添红杏| xxxxx91麻豆| 91经典在线视频| 久久久精品一区| 日韩成人av在线播放| 国产成人精品一区二区| 成人激情电影一区二区| 欧美激情精品久久久久久黑人| 精品国产欧美一区二区五十路| 欧美日本啪啪无遮挡网站| 秋霞午夜一区二区| 国产v综合ⅴ日韩v欧美大片| 国产日本欧美一区二区三区| 色多多国产成人永久免费网站| 欧美激情综合色综合啪啪五月| 日韩黄色高清视频| 欧美亚洲在线观看| 亚洲激情第一页| 久久视频免费在线播放| 亚洲欧美日韩一区二区在线| 亚洲一区二区三区视频播放| 国产成+人+综合+亚洲欧美丁香花| 日韩中文第一页| 欧美在线不卡区| 黑人巨大精品欧美一区二区| 成人国产精品久久久| 欧美裸体男粗大视频在线观看| 亚洲精品电影在线| 91久久久久久久久久| 日韩av电影在线免费播放|