1. 程式人生 > >Java HashMap面試必懂

Java HashMap面試必懂

Hashmap 是執行緒安全的嗎?Hashtable為什麼是執行緒安全的?

HashMap是執行緒不安全的,而Hashtable是執行緒安全的,因為它的所有CRUD操作都被synchronized修飾,這種實現是十分緩慢的。Hashtable不允許出現key和值為null,但是hashmap允許。

下面解釋一下什麼是執行緒安全,什麼是執行緒不安全。  執行緒安全:所謂執行緒安全簡單的講就是控制多個執行緒對某個資源的有序訪問或修改。就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。  執行緒不安全:執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料

HashMap和Hashtable使用內部類Entry<K,V>來儲存資料。這個條目是一個具備兩個額外資料的鍵值對 1、一個對其它Entry的引用,這樣HashMap就可以像單鏈表一樣儲存條目 2、一個雜湊值展示了鍵的哈西值。儲存這個值目的在於避免每次HashMap需要這個值時進行重複計算。

  

hashmap底層採用連結串列來儲存資料,並用一個entry陣列存放所有的連結串列。

1.先計算key的hashcode值,將hash值與陣列的長度減一進行按位與運算,得到索引位置(桶的位置)

2.判斷索引位置的值,諾為空,則直接插入,不為空,判斷桶的結構是紅黑樹還是連結串列,如果是連結串列,遍歷連結串列中的key,如果不存在相同的key,則插入連結串列,判斷插入連結串列後的長度是否大於等於8,如果是則轉為紅黑樹;如果是紅黑樹,則遍歷判斷key即可。

hashmap中的get方法:這個操作的原理就比較簡單,只需要根據keyhashcode算出元素在陣列中的下標,之後遍歷Entry物件(jdk8之後變為Node了)連結串列,直到找到元素為止。(通過equals方法進行key的判斷)