java之Map集合
Map集合(雙列集合)(夫妻對集合)
map的key值是無序的,不可重複的,用Set集合儲存
value值是無序的,可重複的,用Collection集合儲存
key-value存放在Entry類中,Entry類是無序的,不可重複的,用Set集合儲存
1.HashMap
map介面下最常用的實現類,是執行緒不安全的,效率高。
底層儲存資料的結構:陣列+連結串列+紅黑樹(jdk1.8)
儲存過程:
Map<String,String> map = new HashMap<>(); map.put("key","value");
以上面的程式碼為例,
首先會通過呼叫key的hashCode()方法得到雜湊值,通過HashMap中的指定演算法和雜湊值進行運算得到值,這個值是要存放的索引位置。
如果該索引位置不存在值,則將此資料存放在這個位置上。
如果存在值,比較它們的雜湊值,如果相同,則不能存放
如果不同,通過equals()方法進行比較。如果返回true,則不能存放。
如果返回false,則以連結串列的方式存放在這個位置上。
擴容機制:
如果是用無參構造建立的物件,這時建立的是一個長度為0的陣列,當呼叫put()方法後,會建立一個長度為16的陣列。(JDK1.8)
在JDK1.7以前,會直接建立一個長度為16的陣列。
HashMap是根據原始碼中的常量(threshold臨界值)進行擴容的。
原始碼:
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // double threshold
當該陣列的長度大於臨界值(填充因子*容量)時,擴容為原來長度的2倍。
如果當前陣列的某個索引上的元素以連結串列的形式存在的資料長度>8
2.LinkedHashMap(HashMap的子類)
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
在HashMap的基礎上添加了兩個指向。before和after。
與前後資料連線起來了,適合頻繁刪除和插入的操作
3.TreeMap
能排序的Map。
去重原理和HashMap不同。
HashMap是通過hashCode()和equals()實現去重。
TreeMap是通過比較器(Comparable、Comparator)實現去重,返回的值為0,則代表是同一個物件。
存放在TreeMap中的物件都必須實現Comparable或Comparator介面,否則會報錯
注意:
以上去重,都是基於key值進行比較的。