转载

【HashMap】JDK1.8 源码解读

【HashMap】JDK1.8 源码解读

JDK1.8 中文在线版

超类分析

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

【HashMap】JDK1.8 源码解读

Cloneable:支持clone方法。

Serializable:支持序列化。

Map<K,V>:

类注释 [java.util.Map]
    1 Map是一个将键映射到值的对象,不允许包含重复的键,一个键最多映射到一个值。
    2 替代`Dictionary`类,因为它是一个抽象类而不是接口。
    3 Map提供了三个视图,键集合,值集合,键值对集合。
    4 注意:使用可变的对象作为键(会影响对象的equals和hashcode结果),map不会对这种情况做处理。
    5 两个标准构造函数:空参构造函数(空映射),Map传参构造函数(根据传入的map映射构建新映射)。[非强制,JDK原生的map子类都严格遵守]
    6 不支持操作:map的子类不需要接口的某些方法时,建议抛出UnsupportedOperationException,
        如putAll方法对一个不允许修改的Map是多余的,可以抛出UnsupportedOperationException。
    7 键值的限制:通常是空值以及类型的限制。
        当不允许空键或空值时,建议抛出NullPointException,
        当对键值有类型限制时,建议抛出ClassCastException。
    8 Map以键的equals()和hashcode()作为依据。
    
Map接口提供了6大类方法:
    Query: size(); isEmpty(); constaionKey(Obj); containsValue(Obj); get(Obj);
    Modification: put(Obj,Obj); remove(Obj);
    Bulk: putAll(Map); clear();
    Views: keySet(); values(); entrySet();
           Views还提供了 <<Entry>> 键值对interface
    Comparison and hashing: equals(Obj); hashcode();
    Defaultable: default方法,详情可查看源码。

AbstractMap :

类注释[java.util.AbstractMap]
    1 提供了Map的骨架实现,尽量减少实现Map的工作量。
    2 实现不支持修改的Map。
        2.1 实现entrySet方法
        2.2 不支持add和remove方法,迭代器不支持remove方法。
    3 实现可修改的Map
        3.1 实现put方法
        3.2 实现entrySet方法,迭代器支持remove方法。
    4 按照Map接口规范建议,提供两个标准构造函数。

代码实现:
    Query: (基于entrySet()实现)
        size() => 获取entrySet()的size
        isEmpty() => return size() == 0
        constaionKey(Obj) => 遍历entrySet()迭代器
        containsValue(Obj) => 遍历entrySet()迭代器
        get(Obj) => 遍历entrySet()迭代器
    Modification:
        put(Obj,Obj) => UnsupportedOperationException
        remove(Obj) => 遍历entrySet()迭代器
    Bulk: 
        putAll(Map) => 遍历put(Obj,Obj)
        clear() =>  entrySet().clear()
    Views: 
        keySet() => 基于AbstractSet对entrySet()进行封装
        values() => 基于AbstractCollection对entrySet()进行封装
        entrySet() => 抽象方法,返回List<Map.Entry<K,V>>
    Comparison and hashing: 
        equals(Obj) => 
            1 this == obj 
            2 obj instanceof Map
            3 this.size() == ((Map)obj).size
            4 遍历entrySet() 比较key和value是否一一匹配。
        hashcode() => 遍历entrySet(),计算entry的hash总和。
        toString() => {key=val,key=val...}
           
    InnerClass:
        SimpleEntry<K,V>  => 可变的基础entry
        SimpleImmutableEntry<K,V> => 不可变的基础entry

上述对HashMap的超类进行了分析,做一个总结。

  1. Map接口定义了规范 =>
    1.1 键值对 ,错误键值对异常(NullPointException和ClassCastException)
    1.2 视图 :1键 2值 3键值对
    1.3 标准构造器 :1空参 2支持Map传参
    1.4 不支持方法 :UnsupportedOperationException
  2. AbstrctHashMap基于entrySet实现了Map的删/查功能、键/值视图, 子类 关注实现 put(Obj,Obj)entrySet() 即可。

HashMap源码分析

有空再写

原文  https://segmentfault.com/a/1190000022167034
正文到此结束
Loading...