作爲才從事java開發的工作的小白來說,很多時候我們僅僅知道一些類的使用方法,而對於這個類的底層實現,我們卻很少關注。例如一個我們經常使用的集合類HashMap,我們知道通過put存入數據,通過get取數據,卻不知道它底層這些方法是怎麼實現的。由於它的使用的高頻性和在面試中常被問到,今天我們就帶着求知的態度,來深入瞭解一下這個HashMap。
本節,我們先來講一講HashMap的大致輪廓,詳細的核心實現後再後續章節說明。
1.簡述
HashMap是基於java集合中Map接口實現,元素是以鍵值對的形式存儲,並且允許key=null,和value=null。由於HashMap不允許重複,所以只能有一個key=null的情況出現,而且HaspMap是無序的,不能保證元素存存入的順序,也就是說,HashMap不能保證輸出順序和存存入順序一致。最後一個特性就是HashMap不能保證線程安全,這一點與HashTable相反。
2.基本結構
HashMap的基本組成是:jdk1.7及之前是數組+鏈表;jdk1.8之後是數組+鏈表+紅黑樹。
3.繼承關係
public class HashMap<K,V>extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
AbstractMap:Map接口的實現類之一,也是 HashMap, TreeMap, ConcurrentHashMap 等類的父類
Map:java集合Collection的兩個重要接口之一;
Cloneable:一個標記接口,只有實現這個接口後,在類中重寫Object中的clone方法,然後通過類調用clone方法才能克隆成功,如果不實現這個接口,則會拋出CloneNotSupportedException(克隆不被支持)異常;
Serializable:一個對象序列化的接口,一個類只有實現了Serializable接口,它的對象才能被序列化。
4.HashMap基本方法
1)增加元素
public V put(K key, V value)
想HashMap集合中添加鍵爲key,值爲value的元素;若map中原來存有鍵爲key的舊元素,則返回該元素的值value,否則,則返回null;
//存放值
Map<Integer, String> map1 = new HashMap<>();
map1.put(1, "aa");
String oldValue = map1.put(1, "bb");
System.out.println(oldValue);
結果:
2)獲取值
public V get(Object key)
從HashMap集合中獲取鍵爲key的元素的值。
//獲取值
Map<Integer, String> map2 = new HashMap<>();
map2.put(2, "aabb");
String newValue = map2.get(2);
System.out.println(newValue);
結果:
3)刪除元素
public V remove(Object key)
從HashMap中刪除指定key的元素。
//刪除元素
Map<Integer, String> map3 = new HashMap<>();
map3.put(1, "aa");
map3.put(2, "bb");
map3.put(3,"cc");
map3.remove(2);
String value = map3.get(2);
System.out.println(value);
返回爲null,說明元素已經被刪除。
4)判斷HashMap是否爲空
public boolean isEmpty()
HashMap<String, Integer> map=new HashMap<>();
System.out.println(map.isEmpty());//true
map.put("DEMO", 1);
System.out.println(map.isEmpty());//false
5)清空HashMap集合中的元素
public void clear()
/清空元素
HashMap<String, Integer> map=new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(map);
map.clear();
System.out.println(map);
結果:
還有很多方法,這裏就不在一一舉例了。
小結
介紹到這裏,我們基本知道了HashMap是什麼以及能幹什麼有了一個大概的瞭解。但是想要深入瞭解HashMap,就需要我們去查看HashMap的源代碼,好好分析一下它是如何實現這些功能的。
後續將會針對HashMap的源碼,詳細查看它的底層實現。