简单的HashMap初始长度计算方式

        前不久去面试有面试官问我HashMap初始长度计算问题,我把我的计算方法说出来被否定了,因为口头面试也没法明确也忘了原本计算方式就忽略了。然后今天写代码需要定义长度所以特地去自我求证了下,发现并没毛病还更容易记住,所以分享给大家。最原本这个方法是我演化来的还是看的别人的有点记不清了,太过久远。

        不想计算,不想优化性能的请直接设置默认16出门右转。

1.作用

        Map随着元素增加,会进行多次扩容,影响性能。假如我们已经知道要添加的元素数量,创建Map对象就将容量设置到位,就可避免扩容。

2.官方算法

        上源码

    /**
     * Implements Map.putAll and Map constructor.
     *
     * @param m the map
     * @param evict false when initially constructing this map, else
     * true (relayed to method afterNodeInsertion).
     */
    final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
        int s = m.size();
        if (s > 0) {
            if (table == null) { // pre-size
                float ft = ((float)s / loadFactor) + 1.0F;
                int t = ((ft < (float)MAXIMUM_CAPACITY) ?
                         (int)ft : MAXIMUM_CAPACITY);
                if (t > threshold)
                    threshold = tableSizeFor(t);
            }
            else if (s > threshold)
                resize();
            for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
                K key = e.getKey();
                V value = e.getValue();
                putVal(hash(key), key, value, false, evict);
            }
        }
    }

        算法其实挺明确就是初始长度 = int(元素数量/负载因子0.75) + 1,但是总不能每次定义都去+R 输入 calc 计算去吧,假设元素数量是两位数口算0.75太费劲,两位数的乘法运算谁也不是珠心算法传人。

3.简易算法

        我的简易算法,初始长度 = 元素数量 + 1 + int(元素数量/3),算元素数量有几个3,相信在座的各位百位以内计算应该都很容易吧~ 这就比官方的很简单了不是。然后我再把验证的结果给你们看下。

         

        没毛病吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值