java--Map总结(HashMap,-Hashtable,-TreeMap,-WeakHashMap等使用场景)

2017-01-01 22:54

Paste_Image.png

Map概括

  • Map 是“键值对”映射的抽象接口。
  • AbstractMap 实现了Map中的绝大部分函数接口。它减少了“Map的实现类”的重复编码。
  • SortedMap 有序的“键值对”映射接口。
  • NavigableMap 是继承于SortedMap的,支持导航函数的接口。
  • HashMap, Hashtable, TreeMap, WeakHashMap这4个类是“键值对”映射的实现类。它们各有区别!
    • HashMap 是基于“拉链法”实现的散列表。一般用于单线程程序中。 对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法,或者直接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap类。
    • Hashtable 也是基于“拉链法”实现的散列表。它一般用于多线程程序中。
    • WeakHashMap 也是基于“拉链法”实现的散列表,它一般也用于单线程程序中。相比HashMap,WeakHashMap中的键是“弱键”,当“弱键”被GC回收时,它对应的键值对也会被从WeakHashMap中删除;而HashMap中的键是强键。
    • TreeMap 是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射。

HashMap和Hashtable异同

HashMap和Hashtable的相同点

  • HashMap和Hashtable都是存储“键值对(key-value)”的散列表,而且都是采用拉链法实现的。
  • 存储的思想都是:通过table数组存储,数组的每一个元素都是一个Entry;而一个Entry就是一个单向链表,Entry链表中的每一个节点就保存了key-value键值对数据。

HashMap和Hashtable的使用场景

最后再说说“HashMap和Hashtable”使用的情景。
其实,若了解它们之间的不同之处后,可以很容易的区分根据情况进行取舍。例如:

  • 若在单线程中,我们往往会选择HashMap;而在多线程中,则会选择Hashtable。
  • 若不能插入null元素,则选择Hashtable;否则,可以选择HashMap。 但这个不是绝对的标准。例如,在多线程中,我们可以自己对HashMap进行同步,也可以选择ConcurrentHashMap。当HashMap和Hashtable都不能满足自己的需求时,还可以考虑新定义一个类,继承或重新实现散列表;当然,一般情况下是不需要的了。

HashMap和WeakHashMap异同

HashMap和WeakHashMap的相同点

  • 它们都是散列表,存储的是“键值对”映射。
  • 它们都继承于AbstractMap,并且实现Map基础。
  • 它们的构造函数都一样。它们都包括4个构造函数,而且函数的参数都一样。
  • 默认的容量大小是16,默认的加载因子是0.75。
  • 它们的“键”和“值”都允许为null。
  • 它们都是“非同步的”。

HashMap和WeakHashMap的不同点

  • HashMap实现了Cloneable和Serializable接口,而WeakHashMap没有。

    • HashMap实现Cloneable,意味着它能通过clone()克隆自己。
    • HashMap实现Serializable,意味着它支持序列化,能通过序列化去传输。
  • HashMap的“键”是“强引用(StrongReference)”,而WeakHashMap的键是“弱引用(WeakReference)”。WeakReference的“弱键”能实现WeakReference对“键值对”的动态回收。当“弱键”不再被使用到时,GC会回收它,WeakReference也会将“弱键”对应的键值对删除。这个“弱键”实现的动态回收“键值对”的原理呢?其实,通过WeakReference(弱引用)和ReferenceQueue(引用队列)实现的。 首先,我们需要了解WeakHashMap中:

    • 第一,“键”是WeakReference,即key是弱键。
    • 第二,ReferenceQueue是一个引用队列,它是和WeakHashMap联合使用的。当弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。 WeakHashMap中的ReferenceQueue是queue。
    • 第三,WeakHashMap是通过数组实现的,我们假设这个数组是table。

本文来自:http://www.cnblogs.com/skywang12345/p/3311126.html