日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android面试题--HashMap原理分析

發布時間:2023/12/29 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的呢? 我們看一段代碼

public V get(Object key) {int hash = hash(key.hashCode());//先定位到數組元素,再遍歷該元素處的鏈表Node<K,V>[] tab; Node<K,V> first, e; int n; K k;if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) {if (first.hash == hash && ((k = first.key) == key || (key != null && key.equals(k))))return first;if ((e = first.next) != null) {do {if (e.hash == hash &&((k = e. key) == key || (key != null && key.equals(k))))return e;} while ((e = e.next) != null);}}return null; }

二、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原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。