1. 程式人生 > >阿里面試90%以上會問到的資料結構;HashMap

阿里面試90%以上會問到的資料結構;HashMap

BAT面試必問;

關於hashmap,你知道多少?你知道hashmap的工作原理嗎?

1.該問題很有深度

2.能答出多少決定崗位和薪資.

3.問題的方式多種多樣

一.首先我們瞭解下HashMap是什麼

HashMap是Java常用的用來儲存鍵值對的資料結構,它是執行緒不安全的,可以儲存null鍵值,這些大家經常用,也都知道,接下來根據原始碼分析一下HashMap的實現。

1、實現原理

HashMap採用陣列雜湊+連結串列的方式來儲存鍵值對,鍵值對的物件實現如下:

static class Entry<K,V> implements Map.Entry<K,V> { 
 final K key; 
 V value; 
 Entry<K,V> next; 
 final int hash; 
 …… 
} 

通過一個Entry的陣列table就實現了多個物件的儲存,使用雜湊值和鍵值解決了在插入和查詢時的衝突。

2、put方法,寫入鍵值對

public V put(K key, V value){
 //如果 key 為 null,呼叫 putForNullKey 方法寫入null鍵的值
 if (key == null){
 return putForNullKey(value);
}
//根據 key 的 keyCode 計算 Hash 值 
int hash = hash(key.hashCode());
//查詢hash值在table中的索引
int i = indexFor(hash, table.length);
// 如果 i 索引處的 Entry 不為 null,通過迴圈不斷遍歷連結串列查詢是否在連結串列中有相同key的Entry
for (Entry<K,V> e = tablei; e != null; e = e.next) {
 Object k;
 //找到與插入的值的key和hash相同的Entry
 if (e.hash == hash && ((k = e.key) == key|| key.equals(k)){
 //key值相同時直接替換value值,跳出函式
 V oldValue = e.value;
 e.value = value; e.recordAccess(this); return oldValue; } }
// 如果 i 索引處的 Entry 為 null 或者key的hash值相同而key不同 ,則需要新增Entry
modCount++; 
// 將 key、value 新增到 i 索引處
addEntry(hash, key, value, i); 
return null; 
} 

在put方法中解決hash碰撞的方式很清楚,即當兩個entry的hash值相同時,需要對key值是否相同進行判斷,只有key和hash都相同,才能進行修改,否則認為不是同一個entry。

3.addEntry的實現

程式碼:

void addEntry(int hash, K key, V value, int bucketIndex) { // 獲取指定 bucketIndex 索引處的 Entry
Entry<K,V> e = tablebucketIndex; 
tablebucketIndex = new Entry<K,V>(hash, key, value, e); // 如果 Map 中的 key-value 對的數量超過了極限
if (size++ >= threshold)
 resize(2 table.length);
} 

在建立新Entry時如果table的bucketIndex處有元素的話,建立時需要將entry的next設定為原先儲存的元素。

二,HashMap工作原理

以下為目錄,有需要完整進階視訊可以加Android進階群;701740775免費獲取

1.目錄

 

2.順序表與連結串列

 

3.Hsh表

 

 

 

4.Hash原始碼

 

5.碰撞

 

需要完整進階視訊詳解可以加Android進階群;701740775免費獲取!

附錄Android高階技術大綱和進階視訊;