Java集合·11·Map总结
一、Map概括
collection09.jpg总结:
接口:
Map,“键值对(key-value)”映射的抽象接口。
SortedMap,继承Map,有序的“键值对(key-value)”映射的抽象接口。
NavigationMap,继承SortedMap,支持导航函数的接口。
抽象类:
AbstractMap,实现了Map中的大部分函数接口。减少了“Map的实现类”的重复编码。
实现类:
HashMap,基于“拉链法“实现的散列表,一般用于单线程环境中。
HashTable,基于“拉链法”实现的散列表,一般用于多线程环境中。
WeakHashMap,基于“拉链法”实现的散列表,用于多线程环境中,与HashMap相比,WeakHashMap中的键是“弱键”,当“弱键”被GC回收时,它对应的键值对也会被从WeakHashMap中的删除,与此相对,HashMap中的键是“强键”。
TreeMap,有序的散列表,基于“红黑树”实现,一般用于单线程环境中。
二、使用场景
HashMap、HashTable、WeakHashTable、TreeMap区别较大,需要根据具体的要求来选择合适的类。
三、比较
1.HashMap与HashTable的异同点
相同点:
- 存储“键值对(key-value)”映射
- 基于“拉链法”实现
不同点:
- 线程安全性不同,HashMap非线程安全,HashTable线程安全。
- 优化程度不同,HashMap在算法和效率上一直在改进,HashTable已经很久没有更新了,算法和性能上HashMap优于HashTable
- index计算方法
- 扩容时重新散列数据的算法
- 父类不同,HashMap父类是AbstractMap,HashTable是Dictionary
- 对Enumeration支持不同,HashTable支持Enumeration,HashMap不支持。
- 对null值支持不同,HashMap的key、value都可以为null,HashTable的key、value都不支持为null
2.HashMap与WeakHashMap的异同点
相同点:
- 略
不同点:
- HashMap的“键”是强引用(StrongReference),而WeakHashMap的键是“弱引用(WeakReference)。WeakHashMap中的“弱键”能实现WeakReference对键值对的动态回收。当弱键不再被使用时,GC会回收它,WeakHashMap也会移除其相对应的键值对。
五、其他
1.LinkedHashMap
a. 概述
官方定义:
Hash table and linked list implementation of the Map interface, with predictable iteration order.
支持可预测的遍历顺序的键值对映射集合。
继承自HashMap。
实现了Map接口,支持“键值对(key-value)”映射。
b. 数据结构
拉链法
LinkedHashMapEntry
继承HashMapEntry,添加before和after两个LinkedHashMapEntry引用,表示遍历顺序。
c. 特点
- 遍历顺序可控制 添加顺序/访问顺序
d. 实现要点
- 自定义LinkedHashMapEntry,记录顺序信息
- 自定义LinkedHashIterator,根据LinkedHashMapEntry中顺序信息进行便利
- 插入、访问、删除数据时,更新LinkedHashMapEntry中保存的顺序信息
e. 性能(与HashMap比较)
- 对于插入、访问、删除等方法增加了操作量,用于维护双向链表
- 对于Iteration操作节省了时间,只与size相关,而HashMap和capacity相关
f. 扩展
- 实现removeEldestEntry方法,每次put()、putAll()时检查,如果需要的话自动删除旧数据,可用于缓存数据