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優惠券 可以在本商店代替現金 請問實際上折扣是多少?答 由於優惠券可以代...