(題外話:一日不見,如隔三秋But,I‘am here . Always.) java
今天的這一篇是有關於java的又一個很重要的類——Map映像,那咱們接下來就學習Map<K,V>接口的幾個經常使用到的具體實現類。ide
一.HashMap:學習
(特色:key無序散列存放,key惟一)測試
1. 添加:put(key,value);
2. 刪除:remove(key); clear();
3. 修改:put(key,value),覆蓋以前key對應的value值;
4. 查找:containsKey(),containsValue();返回值是true或falsecode
5.提取輸出:也是用迭代器Iterator,可是Map中沒有迭代器,那麼咱們可也使用Collection中的,具體 方法有三種,詳見下列代碼:blog
package map.Map; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class HashMapTest { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); //增長操做,鍵和值 map.put("姓名", "張非"); map.put("密碼", "123"); map.put("郵箱", "hh@163.com"); map.put("姓名", "李斯"); System.out.println(map);//重寫了toString()方法 //修改操做,根據指定的鍵以新值換舊值 map.put("姓名","王劍"); System.out.println(map); //查找操做 System.out.println(map.containsKey("姓名"));//false System.out.println(map.containsValue("張非"));//true System.out.println("--------------------------"); //第一種輸出方式:迭代全部的Key值,再經過get(key)方法獲得value Set<String> set=map.keySet(); Iterator<String> it=set.iterator(); while(it.hasNext()){ String key=it.next(); String value=map.get(key); System.out.println(key+":"+value); } System.out.println("------------------------"); //第二中輸出方式:經過Map.Entry和getKey(),getValue()方法 Set<Map.Entry<String, String>> entry=map.entrySet(); Iterator<Map.Entry<String, String>> entryIt=entry.iterator(); while(entryIt.hasNext()){ Map.Entry<String, String> me=entryIt.next(); String key=me.getKey(); String value=me.getValue(); System.out.println(key+":"+value); } System.out.println("----------------------------"); //第三種輸出方式:只獲得value的方法 Collection<String> col=map.values(); Iterator<String> colIt=col.iterator(); while(colIt.hasNext()){ String value=colIt.next(); System.out.println(value); } } }
運行結果:排序
{姓名=李斯, 密碼=123, 郵箱=hh@163.com} {姓名=王劍, 密碼=123, 郵箱=hh@163.com} true false -------------------------- 姓名:王劍 密碼:123 郵箱:hh@163.com ------------------------ 姓名:王劍 密碼:123 郵箱:hh@163.com ---------------------------- 王劍 123 hh@163.com
二.Hashtable
關於Hashtable,咱們能夠去猜想是否是和HashMap的用法也基本同樣呢?答案是:對的!的確,正如咱們從前學過的ArrayList和Vector,還有stringBuilder和stringBuffer的區別同樣,這裏就不過多說,下面只強調一點Hashtable與HashMap的另一點不一樣:
HashMap中的key值和value值均可覺得null,而Hashtable不能夠,會出現NullPointerException空指針異常
咱們看一下下面簡單的例子:
public class HashtableTest { public static void main(String[] args) { Map<String,String> map=new Hashtable<String,String>(); map.put("姓名", "張非"); map.put(null, null); System.out.println(map); } } 運行結果: Exception in thread "main" java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:394) at map.Map.HashtableTest.main(HashtableTest.java:15)
public class HashtableTest { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); map.put("姓名", "張非"); map.put(null, null); System.out.println(map); } } 運行結果: {null=null, 姓名=張非}
(注意一點:
HashMap中containsKey按照hashcode和equals查找,containsValue根據equals查找,很好理解,由於key值具備惟一性,相似於HashSet,而value值是不惟一的,這樣就很容易理解了)
三.TreeMap
TreeMap就是一種可排序的Map,按照key值進行排序,也就要求TreeMap的key值是具備可比較性的 (關於這一點,能夠根據TreeSet來輔助理解)
固然,當key值不具備比較性時,會出現異常
下面分別給出key值是否有比較性的狀況爲例子:
package map.Map; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; /* * TreeMap的自動按key值排序功能 */ public class TreeMapTest { public static void main(String[] args) { Map<String,User> map=new TreeMap<String,User>(); //建立三個用戶 User user1=new User("張菲"); User user2=new User("趙敏"); User user3=new User("王劍"); //添加key和value的值 map.put("b", user1); map.put("c", user2); map.put("a", user3); //提取輸出顯示 Set<String> set=map.keySet(); Iterator<String> it=set.iterator(); while(it.hasNext()){ String key=it.next(); User value=map.get(key); System.out.println(key+":"+value); } } } 運行結果: a:User王劍 b:User張菲 c:User趙敏
從結果咱們能夠看出:做爲key值得"a","b","c"是按照String的compareTo方法排序以後的結果
上面的例子是以String類型做爲key值得,下面咱們用User類型做爲key值測試一下:
public class TreeMapTest { public static void main(String[] args) { Map<User,String> map=new TreeMap<User,String>(); //建立三個用戶 User user1=new User("張菲"); User user2=new User("趙敏"); User user3=new User("王劍"); //添加key和value的值 map.put(user1,"b"); map.put(user2,"c"); map.put(user3,"a"); System.out.println(map); } } 運行結果: Exception in thread "main" java.lang.ClassCastException: map.Map.User cannot be cast to java.lang.Comparable at java.util.TreeMap.put(TreeMap.java:542) at map.Map.TreeMapTest.main(TreeMapTest.java:19)
能夠看出:出現了ClassCastException類型轉換異常,則通常狀況下用應該使用八種封裝類或String做key值,這一點是值得注意的地方。
當目前爲止,咱們已經把java中有關集合和映像的相關知識大體介紹完了,下面是整個體系關係圖,有助於咱們的理解,一塊兒看一看吧