Map篇
根据查询map接口源码,自己翻译了一些重要注解:
- map是一个能将键映射给值得对象
- map不能包含两个相同的键
- 每个键最多映射到一个值
- 有三种方法看待map接口
4.1 看做key的集合
4.2 看做value的集合
4.3 一组键值对映射 - 对于Map的实现,像TreeMap要确保其顺序的特征
- 可变对象不能做key,比如map对象本身不能做为key,但是可以做为value
- 所有的实现类都应该有两个这样的构造函数:没有参数的构造函数和一个参数的构造函数
- 如果所有键和值都是可序列化的,则它们是可序列化的。否则不能序列化。
- 拿到所有的value,
Collection<String> values = map.values();
- 拿到所有的key,
Set<String> set = map.keySet();
- 拿到Map.Entry,真正存放key-value对的地方
HashMap篇
- JDK1.7 与JDK1.8 的比较
1.1. 7用的是数组+链表的数据结构,8用的是数组+链表+红黑树的结构
1.2 .7的链表是单链表,采用效率高的头插法,8用的是红黑树(阈值为8,数组长度大于64,如果链表小于等于6树还原转为链表,大于等于8转为树)采用尾插法,防止多线程下出现逆序且环形链表死循环问题
1.3. 7的存储位置计算方式(hash值 & length-1),8的是(扩容前的原始位置+扩容的大小值(0,1判断))
1.4 JDK1.7的时候是先进行扩容后进行插入,而在JDK1.8的时候则是先插入后进行扩容 - hashmap put执行流程
https://img-blog.csdnimg.cn/20190122151905332.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmV6aGFvaGFpbWln,size_16,color_FFFFFF,t_70 - hashmap 特点
https://img-blog.csdnimg.cn/20190122151759308.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmV6aGFvaGFpbWln,size_16,color_FFFFFF,t_70 - 为什么阈值为8
因为官方测试,桶的长度超过8的情况下概率最小(0.00000006)。也就是转换成红黑树的概率最小,转换红黑树需要时间和空间。这样节约了时间和空间