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中有关集合和映像的相关知识大体介绍完了,下面是整个体系关系图,有助于咱们的理解,一块儿看一看吧


相关文章
相关标签/搜索