HashMap分享总结

HashMap分享总结

总结公司组织的学习分享活动第一篇----HashMap

先写段最常用的HashMap的伪代码:

  1. Map map = new HashMap();
  2. map.put(key, value);
  3. map.get(key);

HashMap底层数据存储方式采用的是数组加链表的方式; 采用数组是由于数组的查询快, 采用链表是因为链表的增删改快, 组合使用, 提高了HashMap的整体性能; 在jdk1.8中, 链表默认长度为8, 大于8以后转为红黑树, 避免链表长度过大时的降低查询效率; 从这一点, 可以看出, 编程中, 应该在合理的场景下使用合理的方法来处理问题;

1是创建HashMap对象, 大部分情况下, 我们都使用默认的初始容量, 从源码中可知为16; 如果指定初始容量, 则根据指定值进行初始化, 在1.8中, 初始容量 = (指定值 == 2的n次幂) ? 指定值 : 大于等于指定值的最小的2的n次幂; 容量设置为2的n次幂, 是考虑key的离散性; 在HashMap的hash算法中, 采用了key的hashcode经过扰动算法后对(容量-1)的与运算, 容量设置为2的n次幂, -1后有效位的2进制位数都是1, 任何值与1进行与运算, 结果都为本身, 这样可以有效的避免hash碰撞, 提高key的离散性; 同时, 在进行扩容时, 采用二进制的移位运算, 也可以提高性能; 在发生hash碰撞以后, HashMap采用了链地址法进行处理, 即不同的key经过hash算法后, 数组下标相同时, 则将数据存放在数组该下标下的链表中, 后插入的数据添加在链表头, 这也是使用数组+链表的方式的原因之一;

2.增加元素时, 通过hash算法, 计算出key在数组中的下标, 然后遍历该位置的链表, 如果存在相同的key, 则使用新的value替换旧的value, 返回旧的value值, 如果不存在相同的key, 则将元素放在链表的头位置; 添加时, 如果HashMap的size大于初始容量加载因子, 则进行扩容, 扩容时, 如果容量已经到达最大容量2的30次幂, 则不进行扩容, 否则使初始容量右移1位, 即初始容量2;

3.查询时, 用hash算法对key进行计算, 计算出数组下标, 然后遍历链表查询对应的key;

HashMap的源码中, 可以看到很多精巧的设计, 例如数组+链表的存储方式, 红黑树的引入, hashcode值的扰动计算, 等等都是对时间和空间的考虑; 源码都能看懂, 我们不只要看懂源码, 更要问为什么, 从设计角度来考虑, 学习解决问题的思想.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值