咱們都知道Collection、Set、List接口都屬於單值的操做,即:每次只能操做一個對象,而今天介紹的Map與它們不一樣的是,每次操做的是一對對象,即二元偶對象,Map中的每一個元素都使用key -- value的形式存儲在集合之中,此接口定義以下: public interface Map<K,V>java
(一) 先來看看Map接口中都有哪些經常使用的方法:緩存
No.安全 |
方法或類異步 |
類型性能 |
描述spa |
1線程 |
public void clear()code |
普通對象 |
清空Map集合blog |
2 |
public boolean containsKey(Object key) |
普通 |
判斷指定的key是否存在 |
3 |
public boolean containsValue(Object value) |
普通 |
判斷指定的value是否存在 |
4 |
public Set<Map.Entry<K,V>> entrySet() |
普通 |
將Map對象變爲Set集合 |
5 |
public boolean equals(Object o) |
普通 |
對象比較 |
6 |
public V get(Object key) |
普通 |
根據key取得value |
7 |
public int hashCode() |
普通 |
返回哈希碼 |
8 |
public boolean isEmpty() |
普通 |
判斷集合是否爲空 |
9 |
public Set<K> keySet() |
普通 |
取得全部的key |
10 |
public V put(K key, V value) |
普通 |
向集合中加入元素 |
11 |
public void putAll(Map<? extends K,? extends V> t) |
普通 |
將一個Map集合中的內容加入到另外一個Map |
12 |
public V remove(Object key) |
普通 |
根據key刪除value |
13 |
public int size() |
普通 |
取出集合的長度 |
14 |
public Collection<V> values() |
普通 |
取出所有的value |
提出幾個問題:
1.爲何取出所有的value是Collection形式,而取出來key是Set?
2.返回哈希碼有什麼做用?
3.取出集合的長度用size而不是length?
(二)介紹經常使用的接口
1. Map.Entry接口
Map.Entry是Map中內部定義的一個接口,專門用來保存keyvalue的內容。
Map.Entry接口定義: public static interface Map.Entry<K,V>
Map.Entry接口的經常使用方法
No. |
方法或類 |
類型 |
描述 |
1 |
public boolean equals(Object o) |
普通 |
對象比較 |
2 |
public K getKey() |
普通 |
取得key |
3 |
public V getValue() |
普通 |
取得value |
4 |
public int hashCode() |
普通 |
返回哈希碼 |
5 |
public V setValue(V value) |
普通 |
設置value的值 |
注意思考爲何沒有setKey的方法呢?
Map與Map.Entry
2.Map接口的經常使用子類
Map接口的經常使用子類:
HashMap:無序存放的,是新的操做類,key不容許重複。
Hashtable:無序存放的,是舊的操做類,key不容許重複。
TreeMap:能夠排序的Map集合,按集合中的key排序,key不容許重複。
WeakHashMap:弱引用的Map集合,當集合中的某些內容再也不使用時,能夠清除掉無用的數據,可使用gc進行回收。
IdentityHashMap:key能夠重複的Map集合。
2. 着重介紹新的子類:HashMap
HashMap自己是Map的子類,直接使用此類爲Map接口實例化便可。 HashMap類的定義以下: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
實例操做一:向集合中增長和取出內容
import java.util.HashMap; import java.util.Map; public class HashMapDemo01 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象, map = new HashMap<String, String>(); // key和value是String類 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 String val = map.get("first"); // 根據key求出value System.out.println("取出的內容是:" + val); // 輸出Map,調用toString() } }
實例操做二:判斷指定的key或value是否存在
import java.util.HashMap; import java.util.Map; public class HashMapDemo02 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象, map = new HashMap<String, String>(); // key和value是String類 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 if (map.containsKey("first")) { // 查找指定的key是否存在 System.out.println("搜索的key存在!"); } else { System.out.println("搜索的key不存在!"); } if(map.containsValue("cool")){ // 查找指定的value是否存在 System.out.println("搜索的value存在!"); }else{ System.out.println("搜索的value不存在!"); } } }
實例操做三:輸出所有的key
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class HashMapDemo03 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象, map = new HashMap<String, String>(); // key和value是String類 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 Set<String> keys = map.keySet(); // 獲得所有的key Iterator<String> iter = keys.iterator(); // 實例化Iterator System.out.print("所有的key:"); // 輸出信息 while (iter.hasNext()) { // 迭代輸出所有的key String str = iter.next(); // 取出集合的key System.out.print(str + "、"); // 輸出內容 } } }
實例操做四:輸出所有的value
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class HashMapDemo04 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象, map = new HashMap<String, String>(); // key和value是String類 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 Collection<String> values = map.values(); // 獲得所有的value Iterator<String> iter = values.iterator(); // 實例化Iterator System.out.print("所有的value:"); // 輸出信息 while (iter.hasNext()) { // 迭代輸出 String str = iter.next(); // 取出value System.out.print(str + "、"); // 輸出內容 } } }
3.舊的子類:Hashtable
public class HashtableDemo01 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象, map = new Hashtable<String, String>(); // key和value是String類 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 Set<String> keys = map.keySet(); // 獲得所有的key Iterator<String> iter1 = keys.iterator(); // 實例化Iterator System.out.print("所有的key:"); // 輸出信息 while (iter1.hasNext()) { // 迭代輸出所有的key String str = iter1.next(); // 取出內容 System.out.print(str + "、"); // 輸出內容 } Collection<String> values = map.values(); // 獲得所有的value Iterator<String> iter2 = values.iterator(); // 實例化Iterator System.out.print("\n所有的value:"); // 輸出信息 while (iter2.hasNext()) { // 迭代輸出所有的value String str = iter2.next(); // 取出內容 System.out.print(str + "、"); // 輸出內容 } } }
HashMap與Hashtable的區別
No. |
比較點 |
HashMap |
Hashtable |
1 |
推出時間 |
JDK 1.2以後推出的,屬於新的操做類 |
JDK 1.0時推出,屬於舊的操做類 |
2 |
性能 |
採用異步處理方式,性能更高 |
採用同步處理方式,性能較低 |
3 |
線程安全 |
屬於非線程安全的操做類 |
屬於線程安全的操做類 |
4 |
設置空值 |
容許設置null值 |
不能設置null,若是設置則出現NullPointerException異常 |
4.排序的子類:TreeMap
import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo01 { public static void main(String[] args) { Map<String, String> map = null; map = new TreeMap<String, String>(); // 實例化Map對象 map.put("A、first", "cool"); // 增長內容 map.put("C、second", "low");// 增長內容 map.put("B、third", "none"); // 增長內容 Set<String> keys = map.keySet(); // 獲得所有的key Iterator<String> iter = keys.iterator(); // 實例化Iterator while (iter.hasNext()) { // 迭代輸出 String str = iter.next(); // 取出key System.out.println(str + " --> " + map.get(str)); // 取出key對應的內容 } } }
5.弱引用類:WeakHashMap
以前所講解的Map 子類中的數據都是使用強引用保存的,即:裏面的內容不論是否使用都始終在集合中保留,若是但願集合能夠自動清理暫時不用的數據就可使用WeakHashMap類。 WeakHashMap的定義以下: public class WeakHashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>
import java.util.Map; import java.util.WeakHashMap; public class WeakHashMapDemo01 { public static void main(String[] args) { Map<String, String> map = null; map = new WeakHashMap<String, String>(); // 實例化Map對象 map.put(new String("A"), new String("first")); map.put(new String("B"), new String("second")); map.put(new String("C"), new String("third")); System.gc(); // 進行垃圾收集 map.put(new String("D"), new String("fourth")) ; System.out.println("內容:" + map); // 通常只會剩下一個內容 <D,fourth> } }
提示:對象的引用強度說明
從JDK1.2版本開始,Java把對象的引用分爲四種級別,從而使程式能更加靈活的控制對象的生命週期。這四種級別由高到低依次爲:強引用、軟引用、弱引用和虛引用。
下面來簡單瞭解如下這四種引用的區別:
強引用:當內存不足時,JVM寧肯出現OutOfMemeryError錯誤而使程序中止,也不會回收此對象來釋放空間;
軟引用:當內存不足時,會回收這些對象的內存,用來實現內存敏感的高速緩存;
弱引用:不管內存是否緊張,被垃圾回收器發現當即回收;
虛引用:和沒有任何引用同樣。
6.Map接口輸出:
對於Map接口來講,其自己是不能直接使用迭代(例如:Iterator、foreach)進行輸出的,由於Map中的每一個位置存放的是一對值(key---->value),而Iterator中每次只能找到一個值。因此,若是此時非要使用迭代進行輸出的話,則必須按照如下的步驟完成(以Iterator輸出方法爲例):
一、將Map的實例經過entrySet()方法變爲Set接口對象;
二、經過Set接口實例爲Iterator實例化;
三、經過Iterator迭代輸出,每一個內容都是Map.Entry的對象;
四、經過Map.Entry進行key---->value的分離。
Map輸出方式一:Iterator輸出Map
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class IteratorDemo04 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象,指定泛型類型 map = new HashMap<String, String>(); // 實例化Map對象 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 Set<Map.Entry<String, String>> allSet = null; // 聲明一個Set集合,指定泛型 allSet = map.entrySet(); // 將Map接口實例變爲Set接口實例 Iterator<Map.Entry<String, String>> iter = null; // 聲明Iterator對象 iter = allSet.iterator(); // 實例化Iterator對象 while (iter.hasNext()) { Map.Entry<String,String> me = iter.next();// 找到Map.Entry實例 System.out.println(me.getKey() + " --> " + me.getValue()); // 輸出key和value } } }
Map輸出方式二:foreach輸出Map
import java.util.HashMap; import java.util.Map; public class ForeachDemo02 { public static void main(String[] args) { Map<String, String> map = null; // 聲明Map對象,指定泛型類型 map = new HashMap<String, String>(); // 實例化Map對象 map.put("first", "cool"); // 增長內容 map.put("second", "low"); // 增長內容 map.put("third", "none"); // 增長內容 for (Map.Entry<String, String> me : map.entrySet()) {// 輸出Set集合 System.out.println(me.getKey() + " --> " + me.getValue());// 輸出key和value } } }
注意事項二:直接使用非系統類做爲key
若是要使用非系統類做爲Map的key,則此類必須覆寫Object類中的如下兩個方法: hashCode() equals