您当前的位置: 首页 > 

水的精神

暂无认证

  • 1浏览

    0关注

    711博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK 1.8 HashMap 扩容源码详解

水的精神 发布时间:2020-03-05 10:48:03 ,浏览量:1

  作为开发人员,千万不能停留在实现功能上,一定要提升到性能方面上。这需要我们不断的实践,学习源码, 根据底层实现原理,来做出最好的操作。

  就HashMap而言,一定是我们常用的集合,它有着查询速度是 O(1) 的特点,特就是快速获取键值对结果。

  但是如果不去读源码,就不会知道它的默认的大小是capcity 16,负载因子是 0.75 ,在hashmap中存放 超过 caticy * 负载因子,则需要去扩容,扩容的时候,是需要消耗很多资源,因为扩容是扩了两倍,然后需要将原来的复制到新的扩容后的数组里边。

  这个慢的体验就是你想要 put 的时候,如果触发了 扩容 resize() ,则需要等到扩容才能添加进去,注意,现在1.8的源码里边,扩容,就直接把原来的数据重新hash 然后给到扩容后的数组。

  接下来看源码:

final Node[] resize() {
        Node[] oldTab = table;
        int oldCap = (oldTab == null) ? 0 : oldTab.length;
        int oldThr = threshold;
        int newCap, newThr = 0;
        if (oldCap > 0) {
            if (oldCap >= MAXIMUM_CAPACITY) {
                threshold = Integer.MAX_VALUE;
                return oldTab;
            }
            //newCap = oldCap             
关注
打赏
1664074814
查看更多评论
0.0373s