Java集合之Map总结

Map总结

  • Map是所有Map实现类的抽象接口
  • AbstractMap实现了Map接口中的绝大多数方法,减少了Map实现类的重复编码
  • SortedMap是有序的键值对映射接口
  • NavigableMap接口实现了SortedMap接口,并支持导航函数的接口
  • HashMap是基于拉链法实现的散列表,一般用于单线程的程序中;HashTable是基于拉链法实现的散列表,一般用于多线程程序中;WeakHashMap也是基于拉链法实现的散列表,它一般也用在单线程程序中,但相比于HashMap,WeakHashMap的键是弱键,当被GC回收时,WeakHashMap的键值对也会被删除;TreeMap是有序的散列表,通过红黑树来实现,一般用于单线程存储有序映射

HashMap与HashTable的异同

HashMap与HashTable的相同点

首先HashMap和HashTable都是存储“键值对”的散列表,而且都是采用拉链法来实现的,存储思想是通过Table数组来存储,Table中的每一个元素都是一个Entry,而每一个Entry都是一个单链表,Entry链表中的每一个结点都存储了键值对映射。

添加键值对(put):根据key值来计算哈希值,通过哈希值找到Table数组索引,然后根据数组索引找到Entry,然后开始遍历单向链表,若key值已经存在于该单向链表中,则用新的value值来替换旧的value值,若key没用出现过在链表中,则创建一个新的链表结点,将该键值对添加在表头中。

删除键值对(remove):首先根据key值计算哈希值,找到数组索引,根据索引找到Entry,然后遍历该单链表,若该key-value存在于该链表中,则删除链表中的结点

HashMap与HashTable的不同点

继承和实现方式不同

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。

线程的安全不同

Hashtable的几乎所有函数都是同步的,即它是线程安全的,支持多线程。
而HashMap的函数则是非同步的,它不是线程安全的。若要在多线程中使用HashMap,需要我们额外的进行同步处理。 对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法,或者直接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap类。

对null值的处理不同

HashMap允许存储key和value都为null的元素

HashTable不允许存储key或value为null的元素

支持的遍历种类不同

HashMap只支持Iterator(迭代器)遍历。
而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。

Enumeration 是JDK 1.0添加的接口,只有hasMoreElements(), nextElement() 两个API接口,不能通过Enumeration()对元素进行修改 。
而Iterator 是JDK 1.2才添加的接口,支持hasNext(), next(), remove() 三个API接口。HashMap也是JDK 1.2版本才添加的,所以用Iterator取代Enumeration,HashMap只支持Iterator遍历。

通过迭代器遍历时,遍历的顺序不同

HashMap是“从前向后”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。
Hashtable是“从后往前”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。

量初始值和增加方式不同

HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”
Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。

添加键值对时计算哈希值的方法不同

HashMap添加元素时,是使用自定义的哈希算法。
Hashtable没有自定义哈希算法,而直接采用的key的hashCode()。

部分API不同

Hashtable支持contains(Object value)方法,而且重写了toString()方法
而HashMap不支持contains(Object value)方法,没有重写toString()方法。

HashMap和WeakHashMap的异同

HashMap和WeakHashMap的相同点

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

HashMap和WeakHashMap的不同点

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

HashMap的键是强引用,而WeakHashMap的键是弱引用

WeakHashMap动态回收的步骤:

  1. 首先新建一个WeakHashMap的集合,将键值对添加进去
  2. 当某个弱键不再被对象引用时,它将会被GC回收,当GC回收这个弱键的同时会被添加到一个queue队列中
  3. 当下一次使用WeakHashMap时会先同步table和queue,table中保存了全部的键值对,而queue中保存了被GC回收的弱键,同步之后,就可以删除被GC回收的弱键所对应的键值对。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值