深入理解map接口,HashMap

Map篇

根据查询map接口源码,自己翻译了一些重要注解:

  1. map是一个能将键映射给值得对象
  2. map不能包含两个相同的键
  3. 每个键最多映射到一个值
  4. 有三种方法看待map接口
    4.1 看做key的集合
    4.2 看做value的集合
    4.3 一组键值对映射
  5. 对于Map的实现,像TreeMap要确保其顺序的特征
  6. 可变对象不能做key,比如map对象本身不能做为key,但是可以做为value
  7. 所有的实现类都应该有两个这样的构造函数:没有参数的构造函数和一个参数的构造函数
  8. 如果所有键和值都是可序列化的,则它们是可序列化的。否则不能序列化。
  9. 拿到所有的value, Collection<String> values = map.values();
  10. 拿到所有的key,Set<String> set = map.keySet();
  11. 拿到Map.Entry,真正存放key-value对的地方

HashMap篇

  1. 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的时候则是先插入后进行扩容
  2. 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
  3. 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
  4. 为什么阈值为8
    因为官方测试,桶的长度超过8的情况下概率最小(0.00000006)。也就是转换成红黑树的概率最小,转换红黑树需要时间和空间。这样节约了时间和空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值