综合编程

【HashMap】JDK1.8 源码解读

微信扫一扫,分享到朋友圈

【HashMap】JDK1.8 源码解读

HashMapJDK1.8 源码解读

JDK1.8 中文在线版

超类分析

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

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源码分析

有空再写

Springboot拦截器的使用

上一篇

苹果招兵买马 或在开源领域有大动作?

下一篇

你也可能喜欢

评论已经被关闭。

插入图片

热门栏目

【HashMap】JDK1.8 源码解读

长按储存图像,分享给朋友