HashMap底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表,JDK1.8中還引入了紅黑樹,當鏈表長度超過8個時,會將鏈表轉(zhuǎn)成紅黑樹,以提升其查找性能。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供騰沖企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都做網(wǎng)站、H5建站、小程序制作等業(yè)務。10年已為騰沖眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。那么,給出一個<key, value>節(jié)點,HashMap是如何確定這個節(jié)點應該放在具體哪個位置呢?(以JDK1.8為例)
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; // HashMap沒有被初始化,則先進行初始化 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; // 節(jié)點所在index = (n - 1) & hash,該位置沒有數(shù)據(jù),則直接將新節(jié)點放在數(shù)組的index位置上 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { // index上已經(jīng)有節(jié)點了 Node<K,V> e; K k; // 如果新key與原來的key一樣,則e指向原節(jié)點p(后面會用新value替換e所指向的value) if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; // 如果該節(jié)點是樹節(jié)點,則采用樹的插入算法,插入新節(jié)點 else if (p instanceof HashMap.TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else { // 該節(jié)點是鏈表節(jié)點 for (int binCount = 0; ; ++binCount) { // 將新節(jié)點插入到index所在鏈表的末端 if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); // 鏈表節(jié)點超過8個,則進行鏈表轉(zhuǎn)樹處理 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } // 同樣的,如果key已經(jīng)存在的話,則不進行插入操作,而是后面進行value替換 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } // e != null的情況,就是key已經(jīng)存在了,這里統(tǒng)一進行了新值value,替換舊值e.value的操作 if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; // 插入后數(shù)組size 大于閾值的話,需要進行擴容 if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
網(wǎng)站標題:HashMap容量和負載因子使用說明-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://www.rwnh.cn/article2/ccepoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、動態(tài)網(wǎng)站、小程序開發(fā)、定制網(wǎng)站、電子商務、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)