zoukankan      html  css  js  c++  java
  • hashmap分解大法--tableSizeFor方法

    tableSizeFor方法

    /**
     * 根据容量参数,返回一个2的n次幂的table长度。
     */
    private static final int tableSizeFor(int c) {
        int n = c - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }
    public static void main(String[] args) {
        System.out.println(tableSizeFor(1));
        System.out.println(tableSizeFor(7));
        System.out.println(tableSizeFor(29));
        System.out.println(tableSizeFor(122));
        System.out.println(tableSizeFor(789));
    }
    
    输出:
    1
    8
    32
    128
    1024

    通过输出可以大致猜到tableSizeFor的作用是返回一个大于输入参数且最小的为2的n次幂的数。

    我们再来看看是怎么做到的。

    当输入为25的时候,n等于24,转成二进制为1100,右移1位为0110,将1100与0110进行或("|")操作,得到1110。接下来右移两位得11,再进行或操作得1111,接下来操作n的值就不会变化了。最后返回的时候,返回n+1,也就是10000,十进制为32。按照这种逻辑得到2的n次幂的数。

    为什么在方法开始是要执行int n = c - 1的原因是?

    由于int类型为32位,所有即使除符号为之外只有第一位为1的情况,也能将所有的位全部变成1,不过由于最后计算出来为int类型的最大值,此时返回n+1会导致溢出,不能返回期望的结果。
    为什么要在前面减1,然后在后面加回来呢?
    当输入为0的时候就会发现,方法的输出为1,HashMap的容量只有大于0时才有意义。
  • 相关阅读:
    Everspin MRAM技术的可靠性
    如何减小SRAM读写操作时的串扰
    SRAM电路工作原理
    关于如何提高SRAM存储器的新方法
    低功耗SRAM主要三部分功耗来源
    [小米OJ] 6. 交叉队列
    [小米OJ] 4. 最长连续数列
    [小米OJ] 5. 找出旋转有序数列的中间值
    [小米OJ] 3. 大数相减
    [剑指offer] 66. 机器人的运动范围
  • 原文地址:https://www.cnblogs.com/wqbin/p/11198168.html
Copyright © 2011-2022 走看看