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()时检查,如果需要的话自动删除旧数据,可用于缓存数据

你可能感兴趣的:(Java集合·11·Map总结)