摘要:基礎(chǔ)系列的與方法類(lèi)初始化順序線程池如何彈性伸縮的幾個(gè)要點(diǎn)的緩存什么場(chǎng)景下使用阻塞隊(duì)列的使用及模式中的序本文主要記錄的幾個(gè)要點(diǎn)。的過(guò)程修改,也會(huì)判斷是否需要。
Java基礎(chǔ)系列
Java的hashcode與equals方法
Java類(lèi)初始化順序
ThreadPoolExecutor線程池如何彈性伸縮
HashMap的幾個(gè)要點(diǎn)
Integer的緩存
什么場(chǎng)景下使用阻塞隊(duì)列
volatile的使用及DCL模式
try-catch-finally中的return
序本文主要記錄hashmap的幾個(gè)要點(diǎn)。
幾個(gè)參數(shù)初始容量
static final int DEFAULT_INITIAL_CAPACITY = 16; 初始容量:16
最大容量
static final int MAXIMUM_CAPACITY = 1 << 30; 最大容量:2的30次方:1073741824
默認(rèn)負(fù)載因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
擴(kuò)容倍數(shù)
newCap = oldCap << 1; 擴(kuò)容倍數(shù):*2倍
當(dāng)我們調(diào)用get()方法,HashMap會(huì)使用鍵對(duì)象的hashcode找到bucket位置,然后獲取值對(duì)象。如果有兩個(gè)值對(duì)象儲(chǔ)存在同一個(gè)bucket,會(huì)調(diào)用keys.equals()方法去找到鏈表中正確的節(jié)點(diǎn),最終找到要找的值對(duì)象。
put的過(guò)程/** * Implements Map.put and related methods * * @param hash hash for key * @param key the key * @param value the value to put * @param onlyIfAbsent if true, don"t change existing value * @param evict if false, the table is in creation mode. * @return previous value, or null if none */ final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; Node p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; else if (p instanceof TreeNode) e = ((TreeNode )p).putTreeVal(this, tab, hash, key, value); else { for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
修改modCount,也會(huì)判斷是否需要resize。
hash碰撞時(shí)的處理當(dāng)hash沖突時(shí),以前都是用鏈表存儲(chǔ),在java8里頭,當(dāng)節(jié)點(diǎn)個(gè)數(shù)>=TREEIFY_THRESHOLD - 1時(shí),HashMap將采用紅黑樹(shù)存儲(chǔ),這樣最壞的情況下即所有的key都Hash沖突,采用鏈表的話查找時(shí)間為O(n),而采用紅黑樹(shù)為O(logn)。
rehash的時(shí)機(jī)及過(guò)程默認(rèn)的負(fù)載因子大小為0.75,也就是說(shuō),當(dāng)一個(gè)map填滿了75%的bucket時(shí)候,和其它集合類(lèi)(如ArrayList等)一樣,將會(huì)創(chuàng)建原來(lái)HashMap大小的兩倍的bucket數(shù)組,來(lái)重新調(diào)整map的大小,并將原來(lái)的對(duì)象放入新的bucket數(shù)組中。這個(gè)過(guò)程叫作rehashing,因?yàn)樗{(diào)用hash方法找到新的bucket位置。
參考HashMap的工作原理
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65571.html
摘要:本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)行詳細(xì)的剖析與解答。敬請(qǐng)關(guān)注服務(wù)端思維微信公眾號(hào),獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結(jié)合自己過(guò)往的面試經(jīng)驗(yàn),整理了一些核心的知識(shí)清單,幫助讀者更好地回顧與復(fù)習(xí) Java 服務(wù)端核心技術(shù)。本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)...
摘要:方法提供了對(duì)象的值,是一個(gè)方法,返回的默認(rèn)值與一致。通常這個(gè)值是對(duì)象頭部的一部分二進(jìn)制位組成的數(shù)字,具有一定的標(biāo)識(shí)對(duì)象的意義存在,但絕不定于地址。與的關(guān)系相等兩個(gè)對(duì)象,則一定要相等。 Java基礎(chǔ)系列 Java的hashcode與equals方法 Java類(lèi)初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個(gè)要點(diǎn) Integer的緩存 什么場(chǎng)景下使...
摘要:本文是作者自己對(duì)中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對(duì)之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時(shí)搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個(gè)接口,程序可以通過(guò)...
摘要:基礎(chǔ)系列的與方法類(lèi)初始化順序線程池如何彈性伸縮的幾個(gè)要點(diǎn)的緩存什么場(chǎng)景下使用阻塞隊(duì)列的使用及模式中的序本文主要介紹的相關(guān)知識(shí)。典型的使用場(chǎng)景,作為,采用來(lái)做信號(hào)通知不采用的容易出錯(cuò)即模式,就是雙加鎖檢查模式。因而有了雙重檢測(cè)模式的應(yīng)用。 Java基礎(chǔ)系列 Java的hashcode與equals方法 Java類(lèi)初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 Has...
摘要:基礎(chǔ)系列的與方法類(lèi)初始化順序線程池如何彈性伸縮的幾個(gè)要點(diǎn)的緩存什么場(chǎng)景下使用阻塞隊(duì)列的使用及模式中的序本文主要講什么場(chǎng)合適合使用阻塞隊(duì)列。相比之下,阻塞隊(duì)列只允許生產(chǎn)者的速度在一定速度上超過(guò)消費(fèi)者的速度,但不會(huì)超過(guò)很多。 Java基礎(chǔ)系列 Java的hashcode與equals方法 Java類(lèi)初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個(gè)要...
閱讀 2431·2021-11-25 09:43
閱讀 3521·2021-10-25 09:48
閱讀 1401·2021-09-13 10:24
閱讀 2802·2019-08-29 15:07
閱讀 1346·2019-08-29 13:14
閱讀 3332·2019-08-29 12:22
閱讀 1407·2019-08-29 11:32
閱讀 3315·2019-08-29 11:23