Java集合框架详解之继承map接口

趁着最近比较闲,静下心来准备把关于集合框架的东西好好整理一下,边学边整理。近阶段先是整理整体的知识点,一些接口,一些继承类以及它们的特性,用法,后续还会有一些常用的,比较重要的类的jdk源码剖析。

Java集合框架详解之继承set接口:http://blog.csdn.net/JasonZhangOO/article/details/55807103
Java集合框架详解之继承list接口:http://blog.csdn.net/JasonZhangOO/article/details/55807177
Java集合框架详解之继承queue接口:http://blog.csdn.net/JasonZhangOO/article/details/55807197
Java集合框架详解之继承map接口:http://blog.csdn.net/JasonZhangOO/article/details/55807685
Java集合框架详解之一点小总结:http://blog.csdn.net/JasonZhangOO/article/details/55808011

map接口:

这里写图片描述
Map 提供 Key 到 Value 的映射,一个 Map 中不能包含相同的 Key,每个 Key 只能映射一个 Value。Map 接口提供 3 种集合的视图,Map 的内容可以被当作一组 Key 集合,一组 Value 集合,或者一组 Key-Value 映射。

Map 提供的主要方法:
boolean equals(Object o) 比较对象;
boolean remove(Object o) 删除一个对象;
put(Object key,Object value) 添加 key 和 value。

Hashtable:
Hashtable继承了map接口,实现了一个基于key-value的Hash表,不能放入null键值对。旧HashMap的同步版本,新代码中也使用了HashMap。Hashtable是同步的,线程安全。
任何作为key的对象都要实现继承自根object的hashcode和equals方法,通过key计算散列函数确定value的位置。两个相同对象的hashcode必定相同,两个hashcode相同未必相同对象,如果不同对象,即两个对象通过散列函数都散列到同一位置,即冲突。避免相同对象出现不同hashcode,需要同时覆写hashcode和equals方法。

Hashtable的使用:

    Hashtable hashtable = new Hashtable();
    String s1 = "hello";
    String s2 = "abc";
    String s3 = "edf";

    hashtable.put("h", s1); //添加数据key-value
    hashtable.put("a", s2);
    hashtable.put("e", s3);

    System.out.println(hashtable.isEmpty()); //判断是否为空
    System.out.println(hashtable.get("a")); //通过key取value

Hashmap:
HashMap是最常用的map实现。和hashtable类似,但是线程不同步。允许null key和null value。
HashMap迭代子操作时间开销和容量正比,因此初始容量设置小一点。

HashMap的使用:

    HashMap hashMap= new HashMap();
    String s1 = "hello";
    String s2 = "abc";
    String s3 = "edf";

    hashMap.put("h",s1); //添加key-value,如果key存在,则覆盖
    hashMap.put("a",s2);
    hashMap.put("e",s3);

    hashMap.get("h");  //通过key获取value
    hashMap.containsKey("a"); //通过key查询是否有该key-value对
    hashMap.containsValue("abc");//通过value查询是否有该key-value对

    //keyset返回包含key的set集合,然后利用iterator访问key
    for(Iterator it = hashMap.keySet().iterator(); it.hasNext();){  
        String tmp = it.next().toString();  //使用iterator访问元素的key
        System.out.println(tmp + "--");
        System.out.println(hashMap.get(tmp));  //使用iterator访问元素的value
    }

WeakHashMap:
这种Map通常用在数据缓存中。它将键存储在弱引用(WeakReference)中。如果没有强引用指向键对象,这些键就可以被GC垃圾回收线程回收。值被保存在强引用中,所以要确保没有引用从值指向键或者将值也保存在弱引用中
m.put(key, new WeakReference(value))

LinkedHashMap:
HashMap和LinkedList的结合,所有元素的插入顺序存储在LinkedList中。所以迭代LinkedHashMap的条目(entry)、键和值的时候总是遵循插入的顺序。在JDK中,这是元素消耗内存最大的集合。

TreeMap:
一种基于已排序且带导向信息Map的红黑树。每次插入都会按照自然顺序或者给定的比较器排序。这个Map需要实现equals方法和Comparable/Comparator。compareTo需要前后一致。这个类实现了一个NavigableMap接口:可以带有与键数量不同的入口,可以得到键的上一个或者下一个入口,可以得到另一Map某一范围的键(大致和SQL的BETWEEN运算符相同),TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

HashMap和hashtable比较
1)hashtable基于旧的dictionary类,HashMap基于jdk1.2新的map接口。
2)hashtable同步,线程安全;HashMap异步,线程不安全,但是效率高。
3)hashtable不能添加null key和null value;HashMap可以添加null key和null value。
4)不需要线程安全,一般使用HashMap。

HashMap和treemap比较
1)HashMap使用hashcode对元素进行快速查找,元素顺序不固定;treemap元素顺序通过key固定(实现了sortedmap),想要得到有序结果,使用treemap,linkedhashmap是基于元素进入集合的顺序。
2)频繁索引,添加,删除元素使用HashMap,要求添加的键类明确定义了hashCode()和 equals()的实现。
3)二树map一样,但顺序不一样,导致hashCode()不一样。在hashMap中,同样的值的map,顺序不同,equals时false;而在treeMap中,同样的值的map,顺序不同,equals时,true,说明,treeMap在equals()时是整理了顺序了的。

参考文章:
http://www.codeceo.com/article/java-collection-summary.html
http://www.codeceo.com/article/java-collection-class.html
http://www.imooc.com/article/1893
http://blog.csdn.net/softwave/article/details/4166598

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值