Map用于保存具有映射關系的數據,具有兩組值:一組用于保存Map中的key;另一組用于保存Map中的value,形成key-value的存儲形式。
Map集合中包含的一些方法:
void clear():刪除Map集合中的所有key-value對。
boolean containsKey(object key):查詢Map集合中是否包含指定的key,如果包含,返回true。
boolean containsValue(Object value): 查詢Map集合中是否包含指定的value,如果包含返回true。
set entrySet():返回Map中包含的key-value對所組成的Set集合,每個集合元素都是Map.Entry(Entry是Map的內部類)對象。
Object get(Object key):返回指定的key所對應的value;如果此Map中不包括該key,則返回null。
boolean isEmpty():查詢該Map是否為空,如果為空則返回null。
set keyset():返回該map中所有key所組成的集合。
Object put(Object key,Object value):添加一個key-value對,如果當前Map中已有一個與該key相等的key-value對,則新的key-value會覆蓋原來的key-value對。
void putAll(Map m):將指定Map中key-value復制到當前Map中。
Object remove(Object key):刪除指定key所對應的key-value對,返回被刪除key所對應的value,如果key不存在返回null。
boolean remove(Object key, Object value):刪除指定key,value所對應的key-value對。如果成功刪除,則返回true,否則返回false。
int size():返回該Map中key-value的個數。
Collection values():返回該Map中所有value組成的collection。
Java8為Map新增的方法:
Object compute(Object key, BiFunction remappingFunction):該方法使用remappingFunction根據原key-value對計算一個新的value。只要新的value不為null,就使用新的value覆蓋原value;如果原value為null,但新value不為null,則刪除原key-value對;如果原value、新value同時為null,那么該方法不改變任何key-value對,直接返回null。
Object computeIfAbsent(Object key, Function mappingFunction):如果傳入的key參數在Map中對應的value為null,該方法將使用mappingFunction根據原key、value計算一個新的結果,如果該計算結果不為null,則用該計算結果覆蓋原value;如果原Map原來不包括該key,該方法可能會添加一組key-value對。
Object computeIfPResent(Object key, BiFunction remappingFunction):如果傳給該方法的key參數在Map中對應的value不為null,該方法將使用remappingFunction根據原key、value計算一個新結果,如果該計算結果不為null,則使用該結果覆蓋原來的value;如果計算結果為null,則刪除原key-value對。void forEach(BiConsumer action):該方法是Java8為Map新增的一個遍歷key-value對的方法。
Object getOrDefault(Object key, V defaultValue):獲取指定的key對應的value。如果該key不存在,則返回defaultValue。
Object merge(Object key, Object value, BiFunction remappingFunction):該方法會先根據key參數獲取該Map中對應的value。如果獲取的value為null,則直接使用傳入的value覆蓋原value(在這種情況下,可能會添加一組key-value);如果獲取的value不為null,則使用remappingFunction函數根據原value、新value計算一個新的結果,并用新的結果去覆蓋原有的value。
Object putIfAbsent(Object key, Object value):該方法會自動檢測指定的key對應的value是否為null,如果該key對應的value為null,則使用傳入的新value代替原來的null。
Object replace(Object key, Object value):將Map中指定key對應的value替換成新value。如果key在Map中不存在,該方法不會添加key-value對,而是返回null。
Boolean replace(K key, V oldValue, V newValue):將Map中指定的key-value對的原value替換成新value。如果在Map中找到指定的key-value對,則執行替換并返回true,否則返回false。
replaceAll(BiFunction function):該方法使用function對原key-value對執行計算,并將計算結果作為key-value對的value值。
Java8改進的HashMap和Hashtable實現類
HashMap和Hashtable是Map接口的典型實現類。HashMap和Hashtable存在兩點典型區別:
1、 Hashtable是一個線程安全的Map實現,但HashMap是線程不安全的實現,所以HashMap比Hashtable的性能更高一些;但如果有多個線程訪問同一個Map對象時,使用Hashtable會更好。
2、 Hashtable不允許使用null作為key和value,如果試圖將null值放進Hashtable中,將會引發NullPointerException異常,但HashMap可以使用null作為key或value。
PS:
A、 由于HashMap中的key不能重復,所以HashMap中只能最多有一個key-value對的key為null,但可以有無數多個key-value對的value為null。
B、 Hashtable是一個古老的類,他的名字甚至沒有遵守java命名規范。與Vector類似,盡量少用Hashtable實現類,即使是需要創建線程安全的Map實現類,也無需使用Hashtable實現類。
C、 HashMap和Hashtable判斷兩個key值相等的的標準是:兩個key通過equals()方法比較返回true,兩個key的Hashcode值也相等。
LinkHashMap實現類
LinkHashMap是使用雙向鏈表來維護key-value對的次序(其實只考慮了key的次序),該鏈表負責維護Map的迭代順序,迭代順序與key-value對的插入順序一致。
使用Properties讀寫屬性文件
Properties是Hashtable的子類,該對象在處理屬性文件時十分方便。Prooperties類將Map對象和屬性文件關聯起來,從而可以將Map對象中的key-value對寫入屬性文件中,也可以將屬性文件中的“屬性名=屬性值”加載到Map對象中。由于屬性文件中的屬性名和屬性值都是字符串類型,所以Properties里的key、value都是字符串類型的。
該類提供了如下三個方法來修改Properties中的key、value值:
String getProperty(String key):獲取Properties中指定屬性名對應的屬性值,類似于Map中的get(Object key)方法。
String getProperty(String key, String defaultValue): 獲取Properties中指定屬性名對應的屬性值,如果Properties中不存在指定的key時,則該方法指定默認值。
Object setProperty(String key, String value):設置屬性值。
它還提供了兩個讀寫屬性文件的方法:
Void load(InputStream instream):從屬性文件中加載key-value對,將加載到的key-value對追加到Properties中(Properties是Hashtable的子類,他不保證key-value對之間的次序)。
Void store(OutputStream out, String comments):將Properties中的Key-value對輸出到指定的屬性文件中。
SortedMap接口和TreeMap實現類
正如Set接口派生出SortedSet子接口,SortedSet接口有一個TreeSet實現類一樣。Map接口也派生出一個SortedMap子接口,SortedMap接口也有一個TreeMap實現類。
TreeMap就是一個紅黑樹數據結構,每個key-value對作為紅黑樹的一個節點。TreeMap在存儲key-value對(節點),需要根據key對節點進行排序。TreeMap保證所有的key-value對處于有序狀態。TreeMap有兩種排序方式:
自然排序:TreeMap的所有key必須實現Comparable接口,而且所有key必須是同一個類的對象,否則會拋出ClassCastException異常。
定制排序:創建TreeMap時,傳入一個Comparator對象,該對象負責對TreeMap中的key進行排序。采用定制排序不要求TreeMap中的key實現Comparator接口。
TreeMap提供了一系列根據key順序訪問key-value對的方法。
Map.Entry firstEntry():返回該Map中最小key對應的key-value對;如果該Map為空,則返回null。
Object firstKey():返回該Map中最小的key值;如果該Map為空,則返回null。
Map.Entry lastEntry():返回該Map中最大的key所對應的key-value對;如果該Map為空或不存在這樣的key,則都返回null。
Object lastKey():返回該Map中最大的key;如果該Map為空或不存在這樣的key,則返回null。
Map.Entry higherEntry(Object key):返回該Map中大于指定key的后一位key-value對(大于key的最小key)。如果該Map為空,則返回null。
Object higherKey(Object key):返回該Map中大于指定key的最小key;如果該Map為空,則返回null。
Map.Entry lowerEntry(Object key):返回該Map中位于指定key前一位的key-value對(即小于指定key的最大key對應的key-value對);如果該Map為空或不存在這樣的key-value對,則返回null。
Object lowerKey(Object key):返回該Map中位于指定key前一位key(小于指定key的最大key)。如果該Map為空或不存在這樣的key,則返回null。
NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive):返回該Map的子Map,其key范圍是從fromKey(是否包括有傳入的第二個參數決定)到toKey(是否包括由第四個參數決定)。
SortedMap subMap(Object fromKey, Object toKey):返回該Map的子Map,其key值得范圍是由fromKey(包括)到toKey(不包括)。
SortedMap tailMap(Object fromKey):返回該Map的子Map,其范圍是大于fromKey(包括)的所有key。
NavigableMap tailMap(Object fromKey, boolean inclusive):返回該Map的子Map,其key值的范圍是大于fromKey(是否包括取決于第二個參數)的所有key。
SortedMap headMap(Object tokey):返回該Map的子Map,其key的范圍是小于tokey(不包括)的所有key。
NavigableMap heapMap(Object tokey, boolean inclusive):返回該Map的子Map,其key的范圍是小于tokey(是否包括取決于第二個參數)的所有key。
WeakHashMap實現類
WeakHashMap與HashMap的用法基本相似。與HashMap的區別在于,HashMap的值保留了對實際對象的強引用,這意味著只要該HashMap對象不被銷毀,該HashMap中的所有key所引用的對象就不會被垃圾回收,hashMap也不會主動刪除這些key-value對;但WeakHashMap只保留了對實際對象的弱引用,這意味著如果WeakHashMap對象的key所引用的對象沒有被其他強引用變量所引用,則這些key所引用的對象可能被垃圾回收,WeakHashMap也可能自動刪除這些key所對應的key-value對。
IdentityHashMap實現類
這個Map實現類的實現機制與HashMap基本類似,但它在處理兩個key值相等時比較獨特:在IdentityHashMap中,當且僅當兩個key嚴格相等(key1==key2)時,IdentityHashMap才認為這兩個key相等;對于普通的HashMap而言,只要key1和key2通過equals()方法比較返回true,且它們的hashCode值相等即可。
EnumMap實現類
EnumMap是一個和枚舉類一起使用的Map實現,EnumMap中的所有key都必須是單個枚舉類的枚舉值。創建EnumMap時必須顯式或隱式的指定它對應的枚舉類。EnumMap具有以下特征:
1.EnumMap在內部以數組的形式保存,所以這種實現形式十分緊湊高效。
2.EnumMap根據key的自然順序(即枚舉值在枚舉類中定義順序)來維護key-value對的順序。當程序通過keySet()、entrySet()、values()等方法便利EnumMap是可以看到這些順序。
3.EnumMap不允許使用null來做為key,但允許null作為value。如果試圖使用null來做為key,程序將拋出NullPointerException異常。
4.創建EnumMap時必須指定一個枚舉類,從而將該EnumMap和指定枚舉類關聯起來。
新聞熱點
疑難解答