須要注意的是:Hashmap 不是同步的,若是多個線程同時訪問一個 HashMap,而其中至少一個線程從結構上(指添加或者刪除一個或多個映
射關係的任何操做)修改了,則必須保持外部同步,以防止對映射進行意外的非同步訪問html
當咱們 put 的時候,若是 key 存在了,那麼新的 value 會代替舊的 value,而且若是 key 存在的狀況下,該方法返回的是舊的 value,
若是 key 不存在,那麼返回 nulljava
當咱們往 HashMap 中 put 元素的時候,先根據 key 的 hashCode 從新計算 hash 值,根據 hash 值獲得這個元素在數組中的位置(即下標
),若是數組該位置上已經存放有其餘元素了,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最早加入的放在鏈尾。若是數組
該位置上沒有元素,就直接將該元素放到此數組中的該位置上算法
從 HashMap 中 get 元素時,首先計算 key 的 hashCode,找到數組中對應位置的某一元素,而後經過 key 的 equals 方法在對應位置的鏈
表中找到須要的元素數組
簡單地說,HashMap 在底層將 key-value 當成一個總體進行處理,這個總體就是一個 Entry 對象。HashMap 底層採用一個 Entry[] 數組來
保存全部的 key-value 對,當須要存儲一個 Entry 對象時,會根據 hash 算法來決定其在數組中的存儲位置,在根據 equals 方法決定其在該數組
位置上的鏈表中的存儲位置;當須要取出一個Entry 時,也會根據 hash 算法找到其在數組中的存儲位置,再根據 equals 方法從該位置上的鏈表中
取出該Entryspa
Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); }
這種遍歷方式效率低線程
Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); }