Map 接口源码分析

一、 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 接口

猜你喜欢

转载自blog.csdn.net/shida_csdn/article/details/81150623