HashMap面試題

  • HashMap和HashTable

    1、HashMap是線程不安全的,HashTable是線程安全的。

    2、HashMap可以接受null作爲鍵和值,而HashTable不能講null作爲鍵和值。

    3、單線程下,HashTable比HashMap慢,效率低。

  • HashMap和HashSet

    1、HashMap是map集合,而HashSet是set集合。

    2、HashMap中存儲的是鍵值對,而HashSet存儲的是對象。

    3、HashSet實際上是用HashMap實現存儲的。

    4、HashMap是用put()方法添加鍵值對,HashSet是用add()方法添加對象。

    5、HashMap的鍵具有唯一性,通過鍵獲取值,獲取對象時比較快。而HashSet則需要遍歷才能獲取對象。

    6、HashMap和HashSet都是線程不安全的。

  • HashMap的工作原理

    HashMap基於hashing原理,通過put()和get()方法來存儲和獲取對象。當使用put(key, value)方法添加鍵值對時,首先調用鍵對象的hashCode()方法來計算hashCode值(即在bucket中存儲的位置),然後找到bucket中對應的位置來存儲鍵值對對象Map.Entry。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回對象。HashMap使用LinkedList來解決hashCode碰撞問題,在存儲對象時如果發生碰撞(即兩個對象的hashCode值相同),則Entry對象將會存儲在LinkedList的下一個節點中。如果在獲取對象時發生碰撞,則需要在同一的bucket位置的LinkedList中進行查找,用鍵對象的equals()方法找到鍵值對。

  • HashMap的大小調整

    HashMap默認的負載因子大小爲0.75,當一個map填滿了75%的bucket時,將會創建原來map大小的2倍的bucket數組,來調整map的大小,並將原來map中的對象複製到新的bucket數組中。這個過程叫rehashing,因爲它調用hash方法找到新的bucket位置。

  • 爲什麼String,Integer這樣的wrapper類適合作爲鍵?
    因爲String和Integer這樣的類是不可變的,也是final的,且已經重寫了equals()和hashCode方法。爲避免hashCode()衝突,所以需要防止鍵改變。

  • 可以使用ConcurrentHashMap來代替HashTable嗎?
    ConcurrentHashMap可以用來代替HashTable,ConcurrentHashMap同步性能更好,因爲它僅僅根據同步級別對map的一部分進行上鎖。但是HashTable具有更強的線程性。
發佈了49 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章