(题外话:一日不见,如隔三秋But,I‘am here . Always.)    


今天的这一篇是有关于java的又一个很重要的类——Map映像,那我们接下来就学习Map接口的几个常用到的具体实现类。

   一.HashMap:

      (特点:key无序散列存放,key唯一)

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

   2. 删除:remove(key); clear();

   3. 修改:put(key,value),覆盖之前key对应的value;

   4. 查找:containsKey()containsValue();返回值是true或false

   5.提取输出:也是用迭代器Iterator,但是Map中没有迭代器,那么我们可也使用Collection中的,具体    方法有三种,详见下列代码:


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 map=new HashMap();
        //增加操作,键和值
        map.put("姓名", "张非");
        map.put("密码", "123");
        map.put("邮箱", "[email protected]");
        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 set=map.keySet();
        Iterator 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> entry=map.entrySet();
        Iterator> entryIt=entry.iterator();
        while(entryIt.hasNext()){
            Map.Entry me=entryIt.next();
            String key=me.getKey();
            String value=me.getValue();
            System.out.println(key+":"+value);
        }
        System.out.println("----------------------------");
        //第三种输出方式:只得到value的方法
        Collection col=map.values();
        Iterator colIt=col.iterator();
        while(colIt.hasNext()){
            String value=colIt.next();
            System.out.println(value);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    }
}


   运行结果:

{姓名=李斯, 密码=123, 邮箱[email protected]}
{姓名=王剑, 密码=123, 邮箱[email protected]}
true
false
--------------------------
姓名:王剑
密码:123
邮箱:[email protected]
------------------------
姓名:王剑
密码:123
邮箱:[email protected]
----------------------------
王剑
123
[email protected]



二.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 map=new Hashtable();
        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 map=new HashMap();
        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 map=new TreeMap();
        //创建三个用户
        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 set=map.keySet();
        Iterator 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 map=new TreeMap();
        //创建三个用户
        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中有关集合和映像的相关知识大致介绍完了,下面是整个体系关系图,有助于我们的理解,一起看一看吧