阿里面試90%以上會問到的資料結構;HashMap
阿新 • • 發佈:2019-01-14
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高階技術大綱和進階視訊;