Android面试题--HashMap原理分析
目錄
- 一、序言
- 二 、HashMap原理分析
- 二、HashMap和Hashtable區別?
一、序言
作為Android程序員,出去找工作面試,HashMap應該是最常被問到的一種數據類型。那它是怎么實現的吶?我們都知道,數據結構中有數組和鏈表來實現對數據的存儲,這兩者是兩個極端。數組存儲區間是連續的,占用內存嚴重,但查詢效率高;而鏈表存儲區間是離散的,占用內存較小,但時間復雜度高,查詢復雜。有沒有結合兩者特性,既尋址容易、也插入刪除簡單的數據結構呢?答案是肯定的,哈希表(Hash table)就是其中之一。哈希表最常用的一種實現方式是——拉鏈法,可以把它看作“鏈表的數組”。
二 、HashMap原理分析
Hashmap存儲數據的容器也是一個線性數組,它具有一個靜態內部類Node,數據結構如下:
static class Node<K,V> implements Map.Entry<K,V> {final int hash; //對Key計算的hash值final K key; //KeyV value; //valueNode<K,V> next; //鏈表指向的下一個Node }存儲時:
int index = (length - 1) & hash(key); // hash值與Node長度取模,得到數組下標 Node[index] = value;取值時:
int index = (length - 1) & hash(key); // hash值與Node長度取模,得到數組下標 return Node[index];其中的hash方法在java8中實現如下:
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}這個“擾動”函數的價值是:將hash值右移16位(剛好32bit的一半),然后讓自身的上半區與下半區做“亦或”操作,為的是加大低位的隨機性,再與Node長度取模,做為下標,可以有效減少碰撞次數。
那么,兩個key的hash值取模得到相同的index,會不會把前一個node覆蓋呢?
這里就用到了hashmap的鏈式結構了,Node里面有一個next屬性,指向下一個Node。例如,進來一個鍵值對A,對keyhash取模得到index=0,則Node[0]=A,有進來一個鍵值對B,得到對index也為0,hashmap這樣處理,B.next=A,Node[0]=B,這時又進來一個C,同樣index=0,則C.next=B,Node[0]=C。我們發現 數組中總是存放最新的一個Node元素
HashMap是如何根據Key取出value的呢? 我們看一段代碼
二、HashMap和Hashtable區別?
1.HashMap支持null Key和null Value;Hashtable不允許。這是因為HashMap對null進行了特殊處理,將null的hashCode 值定為了0,從而將其存放在哈希表的第0個bucket。2.HashMap是非線程安全,HashMap實現線程安全方法為Map map = Collections.synchronziedMap(new HashMap()); Hashtable是線程安全3.HashMap默認長度是16,擴容是原先的2倍;Hashtable默認長度是11,擴容是原先的2n+14.HashMap繼承AbstractMap;Hashtable繼承了Dictionary總結
以上是生活随笔為你收集整理的Android面试题--HashMap原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 被面试官问的Android基础题难倒了?
- 下一篇: 表格学生表html,js编程练习:制作一