即預設桶的數量為16,一般第一次擴容時會擴容到64,之後為2倍的擴容
loadfactor譯為裝載因子,預設為0.75,裝載因子用來衡量hashmap滿的程度
最大容量: 2^ 30 次方
樹形閾值:jdk 1.8 新增的,當使用 樹 而不是列表來作為桶時使用。必須必 2 大,也就是當桶後的鍊錶大於8時,鍊錶會公升級為紅黑樹
非樹形閾值:也是 1.8 新增的,擴容時**乙個樹形桶的閾值,要比 treeify_threshold 小,也就是當鍊表數到6時,從樹形結構退化為鍊錶
hashmap並不是在new的時候直接初始化的,而是在put的時候進行初始化的,可以檢視原始碼如下:
上訴hashmap的構造方法中,只是對傳入的容量值和裝載因子進行判斷是否合法,如果是在構造方法中直接傳入乙個map進行初始化的原始碼中會呼叫putval這個方法進行節點建立,而呼叫put方法,最後也是會呼叫putval方法,最後呼叫resize方法進行初始化。
hashmap進行put方法放入資料時,會呼叫進行hash值和equals進行比較,如果都相等,直接覆蓋前面的值。
擴容/初始化呼叫的就是原始碼中的resize()方法。
擴容過程中幾個關鍵的點:
1.新初始化雜湊表時,容量為預設容量,閾值為 容量*載入因子,載入因子用於計算閥值使用
2.已有雜湊表擴容時,容量、閾值均翻倍
3.如果之前這個桶的節點型別是樹,需要把新雜湊表裡當前桶也變成樹形結構
4.複製給新雜湊表中需要重新索引(rehash),這裡採用的計算方法是
e.hash & (newcap - 1),等價於 e.hash % newcap
hashmap進行擴容時,需要迭代所有的元素,rehash、賦值,還得保留原來的資料結構,所以效能開銷較大,應盡量避免呼叫resize方法進行擴容。
記一次面試經歷
今早七點半的巴士從中山趕到廣州面試php開發助理,以前面的都是十來人 幾十人的小公司,不少還是培訓公司,坑的一逼!這次的公司不錯,比較正規,好歹上百人了,只是筆試題做得一般,題目有的雖有學過,但忘了,好吧!這就是沒準備充分的緣故!下面羅列下我還記得的題目 有些漏了就沒辦法了 之後hr面試聊了下,雖然...
記一次失敗的面試經歷
背景 面試者 王某 以下簡稱我 嵌入式行業剛入門 10年工作經歷 從事方向為 gps bd導航,物聯網,車聯網方向 面試官 前華為員工 3年工作經驗,現為1 創業公司嵌入式部門leader,公司已獲得風投注資500w rmb,產品方向為物聯網和小眾市場產品。面試地點 陝西某眾創空間 職位 高階嵌入式...
記一次前端面試經歷
近日去某獨角獸公司面試了一波,本以為憑藉幾年的豐富專案積累能順風順水的,結果被面試官 教育 了一番,著實慚愧。被連續幾個前端知識點問道懵逼,回來後好好補習了一番。以下是對面試問題的思考 1.let,const定義的變數可以不賦值嗎,指向 答 let 可以不賦值,const不能不賦值 會報 missi...