一、 JDK 1.8 中 Map 接口类图
二、 关键点解读
a. Map 是 Dictionary 的替代者,前者是接口,后者是抽象类,属于平级关系
Dictionary 中的抽象方法在 Map 接口中基本都有,特殊的只有两个,而且 Map 中已有替代方法
Dictionary 已被标注废弃,不建议使用
Dictionary 不允许 Key 或 Value 为 null,Map 则不限制
Dictionary / Map 的 get 方法,Key 不存时在返回 null
Dictionary / Map 的 put 方法带返回值,如果当前 Key 已存在,返回更新前的 Value,如果不存在,返回 null
Dictionary / Map 的 remove 方法, 当 Key 不存在,什么都不做,返回删除之前的 Value
abstract public Enumeration<K> keys(); ==> Set<K> keySet();
abstract public Enumeration<V> elements(); ==> Collection<V> values();
b. Map 的三种遍历方法:keySet、values、entrySet,注意 values 不一定是 Set 集合
Map 的遍历顺序,依赖上述三种集合是否有序,HashMap 无序,TreeMap 有序
Map 依赖 equals 方法判断 Key 是否是目标 Key,可变对象作为 Key 需要注意 equals 方法的实现
JDK 建议,Map 的实现类应该提供拷贝构造函数
c. size 超过 Integer.MAX_VALUE 返回 Integer.MAX_VALUE
boolean containsKey(Object key); // 注意,这里 Key 是 Object 对象,可能 ClassCastException,containsValue 相同
boolean containsValue(Object value); // 可能需要线性时间复杂度查找,和 Map 大小有关
get 相关参数都是 Object,put 相关参数是 K,V,查询参数比较kuan宽泛
通过 keySet、values、entrySet 得到的集合与原 Map 是关联的,
其中一个变了,另一个也跟随变化,多线程需要特别注意,Set 支持移除,不支持增加
forEach 、replaceAll 、compute 、merge 等引入了函数式编程体验,
map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
d. Map 接口内嵌了 Entry 接口