那些年被面試官按在地上摩擦系列一(基於hashMap系列)

那些年被面試官按在地上摩擦面試題系列一

  1. HashMap底層原理
    HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,然後找到bucket位置來儲存值對象。當獲取對象時,通過hash值找到bucket,通過鍵對象的equals()方法找到正確的鍵值對返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。 HashMap在每個鏈表節點中儲存鍵值對對象。當兩個不同的鍵對象的hashcode相同時, 它們會儲存在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到鍵值對。 (jdk1.7以後當bucket位置對應鏈表長度爲8後建以紅黑樹來進行存儲。 面試官可能會追問 鏈表與紅黑樹相關問題,這個等後面再說), (此時面試官會心一笑,小夥子不錯!)
    此刻自我內心寫照

  2. HashMap與HashTable有和不同?
    HashMap與HashTable不用之處主要在三點:線程安全性,鍵值是否爲空,內部迭代器
    HashMap是非線程安全的,HashTable是線程安全的內部方法上使用了synchronization來保證線程安全。因此在單線程情況下HashTable速度要低於HashMape
    HashMap中key-value都可以存儲爲null,而HashTable則不允許爲null
    HashMap的迭代器(Iterator)是fail-fast迭代器,當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並不是一個一定發生的行爲,要看JVM。這條同樣也是Enumeration和Iterator的區別。
    Collections.synchronizedMap()和Hashtable一樣,實現上在調用map所有方法時,都對整個map進行同步
    在這裏插入圖片描述
    (接下來會接問那麼我們使用怎麼使用線程安全的map那??)

  3. Hashtable和ConcurrentHashMap如何實現線程安全
    Hashtable使用synchronization來保證線程安全,因此操作時會鎖住了整個hash表,性能較差。而ConcurrentHashMap則使用分段,來鎖住不同區域,ConcurrentHashMap將hash片段分爲了16個區域,只針對此指定段hash上鎖但有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖.

  4. HashMap的resize方法中尾部遍歷出現死循環問題 Tail Traversing (多線程)
    建議看此鏈接:https://www.cnblogs.com/gxyandwmm/p/9537669.html

—後續會繼續錄入關於hashmap系列題

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章