java的map容器类_Java容器笔记(三):不同Map实现类的特点与区别

可以这样简单的来对待容器中Map的分类:

465194a13395

Map.png

仅讨论Java.util包中的常见Map类,不涉及java.util.concurrent中的并发Map类

接口和抽象类

Map

Map没有继承Collection接口,Map提供key到value的映射。

一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

AbstractMap

实现了Map中的绝大部分函数接口。它减少了“Map的实现类”的重复编码。

SortedMap

实现该接口,说明该Map依据key进行排序。

A Map that further provides a total ordering on its keys

NavigableMap

实现该接口,说明Map具有更多定位(或搜索)元素的方法。

A SortedMap extended with navigation methods returning the closest matches

for given search targets。

All of these methods are designed for locating, not traversing entries.

Dictionary

This class is obsolete. New implementations should implement the Map interface,

rather than extending this class

实现类

HashMap

数据结构为链表数组,key和value都允许null,未实现线程同步

(1)HashMap默认的容量大小是16;增加容量时,每次将容量变为原始容量x2。

(2)HashMap添加元素时,是使用自定义的哈希算法。

(3)通过Iterator迭代器遍历时:“从前向后”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。

Hashtable

数据结构为链表数组,key和value都不允许null,实现了线程同步

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

(2)Hashtable没有自定义哈希算法,而直接采用的key的hashCode()。

(3)通过Iterator迭代器遍历时:“从后向前”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。

WeakHashMap

WeakHashMap是一种改进的HashMap,它对key实行弱引用,如果一个key不再被外部所引用,那么该key可以被GC回收。

LinkedHashMap

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序。

在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

也可以在构造时用带参数,按照应用次数排序。

在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

区别在于HashMap并不是按插入次序顺序存放的,而LinkedHashMap是顺序存放的。

如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列。

TreeMap

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

常见面试题

HashMap与HashTable的区别

都是无序存放

Hashtable线程同步(通过synchronized实现 ),HashMap线程不同步。

Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)。

Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数:默认大小不同,扩容方式不同

HashMap提供对key的Set进行遍历(Iterator),因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。

参考

未一一列出,待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值