Java中的Map (HashMap,Hashtable,TreeMap以及java集合類小結)

(題外話:一日不見,如隔三秋But,I‘am here . Always.)    java


今天的這一篇是有關於java的又一個很重要的類——Map映像,那咱們接下來就學習Map<K,V>接口的幾個經常使用到的具體實現類。ide

   一.HashMap:學習

      (特色:key無序散列存放,key惟一)測試

   1. 添加:put(key,value); ui

   2. 刪除:remove(key); clear(); spa

   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中有關集合和映像的相關知識大體介紹完了,下面是整個體系關係圖,有助於咱們的理解,一塊兒看一看吧


相關文章
相關標籤/搜索