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