HashMap面試準備

2021-10-19 01:17:40 字數 1900 閱讀 2168

hashmap 、linkedhashmap、concurrenthashmap

總的來說,1.7的hashmap的底層是陣列+鍊錶,而1.8的hashmap的底層是陣列+鍊錶或紅黑樹。hashmap是執行緒不安全的。

初始化的方式有三種:(引數有兩個,其一是capacity容量,其二是載入因子)

首先,設計者給了兩個引數預設的值 :capacity容量為16和載入因子為0.75。

①無參構造:直接使用兩個預設值進行構造

②capacity容量:載入因子使用預設值

③雙引數構造法:capaciry如果超過max值,那麼會使用max值,capacity小於0會拋異常,而載入因子小於0也會拋異常。

get方法呼叫的是getnode方法,引數是key的雜湊值和key,看返回的是不是null值,不是說明有元素,則返回相應的value,否則返回null。

那麼getnode方法:

先判斷表是否存在,表有沒有元素,hash的位置有沒有元素

然後check hash的第乙個元素

接著判斷引用是否相等,然後equals是否相等

都沒有的話就獲取到下乙個節點。

判斷是rbtree 還是linkedlist (1.7的話就是直接搜鍊錶了)

進行不同的遍歷

get到就直接break返回了。

put方法呼叫putval

判斷是rbtree還是鍊錶:

鍊錶尾插(1.7頭插法)

擴容是這樣,hash位址值和oldcapacity進行與操作,結果只有1和0兩種結果,因為擴容是兩倍增長,例如原來size為16那麼下表0-15,乙個hash為0,那麼擴容後為32,下標為0-31那麼原來0的位置的鍊錶有兩個去處,其一是0(原地不動),其二是0+16oldcapacity=16,那麼0和1就是起到這個效果,剪短鍊錶。那麼紅黑數也差不多,他不僅有紅黑數的特徵,還是乙個雙向鍊錶,

不一樣的是,rbtree分成兩段後,會進行一系列的判斷,例如是否左邊沒有元素 或者右邊沒有元素 那麼直接移動整棵樹,提高效率,又或者是分成兩段後的個數是否<=6個,如果是就轉換回鍊錶結構。

(1.7的話就簡單許多,就是直接煉表頭插法就完事了,特點是每次擴容資料都會倒置)

這個是執行緒安全的 ,而且1.7和1.8的差別很大

總的來說,1.7 使用reentrantlock ,而1.8採用synchronized 關鍵字。

1.7unsafe中的方法關鍵之一

cas compareandsafe

os層的方法,原子操作

== 準備操作前還會不停的獲取記憶體的元素和obj的比較進行check

只有當這兩個是一致的時候才會執行原子操作

按我的理解是分為三層結構:

①segment層

②hashentry層

③link層

構造法是有三個引數(segment size,factor,hashentry size)

預設是16 0.75 16

segment的個數的固定的,不會進行擴容

而hashentry會進行擴容,

乙個segment對應的hashentry 或者叫管理的個數是 hashentry.size %segment.size 上取整。

由預設推出最少的情況是1:1的比例,但是實際上是1:2。

然後擴容的時候,是互不相干的,擴容只會擴容對應segment下的hashentry陣列。 與hash鍊錶遷移方式大致一致吧。

put 和get方法的話也是先用key找到segment 然後在對應segment上找到對應的hashentry位置,查詢鍊錶或插入。

(有判重操作)

1.8不再使用segment層

不太恰當的理解就是每個陣列下表相當於乙個segment ,對每個位置進行加鎖。

為null時用unsafe的cas保證併發安全

不為null時使用synchronized關鍵字

2012面試準備 2012 10 26面試準備

c 1 什麼純虛函式?首先,二者申明不一樣。virtual void test void 虛函式 virtual void test void 0 純虛函式 其次,如果乙個類包含了乙個純虛函式 哪怕只有乙個是純虛函式 那麼它就是乙個抽象類 就是不能生成具體的物件!但如果類中只包含虛函式,那麼是可以定...

面試需要準備!!

1 請介紹一下你自己。這是外企常問的問題。一般人回答這個問題過於平常,只說姓名 年齡 愛好 工作經驗,這些在簡歷上都有,其 實,外企最希望知道的是求職者能否勝任工作,包括 最強的技能 最深入研究的知識領域 個性中最積極的部分 做過的最成功的事,主要的成就等,這些都可以 和學習無關,也可以和學習有關,...

騰訊面試準備

1.const的含義及實現機制,比如 const int i,是怎麼做到i只可讀的?答 const用來說明所定義的變數是唯讀的,這些在編譯期間完成,編譯器可能使用常數直接替換掉對此變數的引用 2.到商店裡買200的商品返還100優惠券 可以在本商店代替現金 請問實際上折扣是多少?答 由於優惠券可以代...