目錄導讀:
- Map 概述
- HashMap(線程不安全)
- LinkedHashMap
- Hashtable(線程安全)
- Properties(可用于讀寫屬性文件,如ini文件)
- TreeMap(類比于TreeSet)
- WeakHashMap
- IdentityHashMap
- EnumMap
- 各個Map實現類的性能分析
1.Map 概述
Map 保存的是鍵值對數據的集合,也被稱為字典,或關聯數組
Map類似于一個瓶子,因此,里面的元素不允許重復, 且無序的。
將Map的key-value中的key單獨拿出來看時,它們就是一個Set集合,故不可以重復
value單獨拿出來看時,它們類似一個List集合(可以重復,可以為null),只是索引不再是整數值,而是另一個對象key
注意:
HashMap允許有一個null作為key
Hastable不允許null做為其key和value
1.Map 集合的操作
由于是key-value,則操作時針對key和value的一些增、刪、判斷等
(1)增
Object put(Object key, Object value); //添加一個key-value對,如Map中已存在key,則新的鍵值對會覆蓋原來的鍵值對,并返回被覆蓋的value
void putAll(Map m); //將m中的鍵值對復制到本Map中
(2)刪
void clear(); //刪除該Map對象中的所有key-value對
Object remove(Object key); //刪除指定key所對應的鍵值對,并返回該鍵值對的值,若key不存在,則返回null
boolean remove(Object key, Object value); //Java8新增的方法,刪除指定的key-value,
(3)判斷
boolean containsKey(Object key); //判斷Map中是否有指定的key,有則返回true
boolean containsValue(Object value); //判斷Map中是否包含一個或多個value
boolean isEmpty(); //判斷該Map是否為空
(4)獲取
Object get(Object key); //返回指定key所對應的value,若不包含該key則返回null
int size(); //返回Map里鍵值對的個數,即元素個數
Set keySet(); //返回該Map中的所有key組成的Set集合
Collection values(); //返回該Map里所有的value組成的Collection
Set<Map.Entry<K,V>> entrySet(); //返回key-value對所組成的Set集合,每個集合元素都是Map.Entry對象
注:Entry是Map對象的內部類,該類封裝了一個key-value對,Entry包含如下三個方法:
1.Object getKey(); //返回Entry里包含的key值
2.Object getValue(); //返回Entry里包含的value
3.Object setValue(V value); //設置Entry里包含的value值,并返回新設置的value值
(5)遍歷
就要借助上面的提到的方法,再結合foreach循環即可完成遍歷
Set keySet(); //返回該Map中的所有key組成的Set集合
2.HashMap 和 Hashtable 實現類
它們都是Map接口的典型實現類,Hashtable是個古老的類(從名字里就可以看出的),線程安全
Hashtable和HashMap的區別?
1.Hashtable是線程安全,HashMap是線程不安全的,因此,HashMap的性能好一點。但對于多線程
情況下,Hashtable會更好。但為了達到線程安全,建議使用Collections工具類將HashMap包裝成線程安全的
2.Hashtable不允許null做為key和value,如果將null作為key或value放入Hashtable均會引
發java.lang.NullPointerException; HashMap則可以將null作為key或value存入, 且key只能有一個為null,
value可以有無數多個
為了成功的在Hashtable和HashMap中存儲、獲取對象,用作key的對象必須實現hashCode()和equals()方法(尤其是那些自定義的類)
Hashtable和HashMap判斷兩個key相等的標準是:兩個key通過equals()返回true,且hashCode()返回值也相等
Hashtable和HashMap判斷兩個value相等的標準是: 同equals()方法比較返回true即可
3.LinkedHashMap 實現類
是HashMap的子類,同LinkedHashSet一樣,也是雙向鏈表來維護key-value對的次序,
由于它是有序,如果添加元素時按順序添加,就可"排序"訪問,這就省去了用HashMap和Hashtable存儲后再進行排序的尷尬。
由于需要維護其插入順序,因此,性能略低與HashMap。但在迭代訪問Map里的全部元素時有較好的性能(因為內部是鏈表維護的順序)
4.Properties 類
是Hashtable的子類,用于處理屬性文件的。它在Map對象和屬性文件之間起橋梁作用
相關方法:
String getProperty(String key); // 獲取Properties中指定屬性名對應的屬性值
String getProperty(String key, String defaultValue); //與前面的方法類似,只是如果該key不存在,則返回該默認值defaultValue
Object setProperty(String key, String value); //設置屬性值
//讀寫屬性文件的方法
void load(InputStream inStream); //從屬性文件中加載key-value對大Properties里
void store(OutputStream out, String comments); //將Properties中的key-value輸出到指定的屬性文件中,comments是注釋次信息
5.TreeMap 實現類
·如同Set接口派生出了SortedSet接口一樣,Map接口也派生出了SortedMap接口,其實現類:TreeMap
·由于TreeMap具有排序性,因此在Map方法的基礎上增加了一些訪問第一個、最后一個、截取某部分等的方法
如:
Map.Entry firstEntry(); //返回該Map中最小的key對應的key-value對,若為空,返回null
Object firstKey(); //返回Map中最小key值,如為空,返回null
Map.Entry lastEntry();
Object lastKey();
SortedMap subMap(Object fromKey, Object toKey); //
·TreeMap同行TreeSet一樣也有兩種排序狀態:
自然排序:
定制排序:
6.WeakHashMap 實現類
用法基本同HashMap,只是它的key保留了對實際對象的弱引用。而HashMap的key保留了對實際對象的強引用,
即只要該HashMap對象不被銷毀,該HashMap的所有key引用的對象就不會被垃圾回收,HashMap也不會自動刪除
這些key所對應的key-value對。而WeakHashMap對象的key所引用的對象如果沒有被其他變量強引用,則這些key
所引用的對象可能被垃圾回收,WeakHashMap也可能自動刪除這些key所對應的key-value對。
注意:
1.不要讓WeakHashMap的key所引用的對象具有任何強飲用,否則將失去WeakHashMap的意義
WeakHashMap whm = new WeakHashMap();
whm.put("java", new String("200")); //具有強引用, "java"
whm.put(new String("android"), new String("200")); //弱引用
7.IdentityHashMap 實現類
用法基本同HashMap,只是它在處理兩個key是否相等時等價嚴格:當且僅當 key1==key2 時,才認為它們相等
普通的HashMap則只要key1和key2通過equals()方法返回true,hashCode()值相等即可。
如:
IdentityHashMap ith = new IdentityHashMap();
ith.put(new String("java"), 78);
ith.put(new String("java"), 45); //兩個均能添加進去,因為是new的,肯定不相等,便認為是兩個對象
ith.put("android", 45);
ith.put("android", 51); //只能存在一個(最后這個)
8.EnumMap 實現類
·添加的key-value對的key須是枚舉類的枚舉值。
·按枚舉類中的順序維護key的有序性
·不允許null作為key,否則引發NullPointerException異常;如果查詢是否包含null的key,或刪除值為null的key,都不會拋異常(盡管不會成功)
·內部以數組形式保存key-value,因此很高效,緊湊
9.各個Map實現類的性能分析
1.HashMap和Hashtable的實現機制幾乎一樣(都是基于hash算法),但Hashtable是一個古老、線程安全的類,因此
性能不如HashMap
2.TreeMap底層是基于紅黑樹實現,要維護key-value的有序性,因此性能不如HashMap和Hashtable。但它的key-value對
的有序性,使得在查找方面有優勢
3.LinkedHashMap底層因采用鏈表來維護有序性,因此它的性能不如HashMap。但它能保證有序性
4.EnumSet的實現性能最好,底層是基于數組實現的,但key只能是枚舉值