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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,134评论 0 8
  • Map 我们都知道 Map 是键值对关系的集合,并且键唯一,键一对一对应值。 关于 Map 的定义,大概就这些吧,...
    Anonymous___阅读 644评论 0 1
  • 作为一个程序员,在找工作的过程中,都会遇到笔试,而很多笔试里面都包括java,尤其是作为一个Android开发工程...
    左神话阅读 8,076评论 15 295
  • 能够伴你走过半生的情谊,就如同积淀下的沙石,自有其份量。在这物欲横流的社会里,最是真情难得。友情不知在何时也沾染了...
    漩涡旋阅读 272评论 0 1
  • 根据前面3篇文章讲的内容,我们得到了核心任务的流程,接下来就是要把文字流程图变成图形界面了,这里才是画原型的开始。...
    烤鱼吃辣椒阅读 537评论 0 5