(面试题)为什么hashMap里的数组大小设计为2的n次方

视频讲解连接:为什么hashMap里的数组大小设计为2的n次方讲解视频链接

1.首先我们来了解一下 这样设计的目的是什么,以及用到的相关知识

1.设计目的:是为了可以根据hashcode去计算数组的下标
2.相关知识:&在二进制中的运算规则 都为1才显示1 其他的则为0

2.接着我们来看2的n次方 - 1后的值的二进制有什么特征

在这里插入图片描述

① 为什么减一

1.数组的下标是从0开始 所以 数组的下标最大索引比数组大小少1
2.有没有发现一个规律 就是 2的n次方减一的二进制的值的低位都是1

② 为什么要低位都为1

1.因为 &运算的判断逻辑是 都为1 返回1 否则返回0
2.因此 当这些低位都为1的数字 在与任何数&运算时 能够保证 所得的值永远在0到2的n次方-1 之间 (给定的数字是0是 则最终结果为0 当给定的数字低位都是1时 则结果为2的n次方-1)

③ 总结

2的n次方的二进制值低位都是1 说明了 该数与任意数字做&运算 则高位必定会0 参与运算的只有低位 而具体的值 则取决与给定的int值 所以 2的n次方的值 决定了参与运算的有效数字的位数 而给定的值则决定了最终值 而这个最终值的大小 肯定是在0到2的n次方减一

3 测试实例

/**
     * 为什么hashMap里的数组大小设计为2的n次方
     * 相关知识:&在二进制中的运算规则 都为1才显示1 其他的则为0
     * 设计目的:是为了可以根据hashcode去计算数组的下标
     */
    public static void main(String[] args) {
        //2的n次方的二进制值低位都是1 说明了 该数与任意数字做&运算 则高位必定会0 参与运算的只有低位
        //而具体的值 则取决与给定的int值 所以 2的n次方的值 决定了参与运算的有效数字的位数 而给定的值则决定了
        //最终值 而这个最终值的大小 肯肯定是在0到2的n次方减一
        String a = Integer.toBinaryString(2-1);
        String a1 = Integer.toBinaryString(4-1);
        String a2 = Integer.toBinaryString(8-1);
        String a3 = Integer.toBinaryString(16-1);
        String a4 = Integer.toBinaryString(32-1);
        String a5 = Integer.toBinaryString(64-1);
        Person person = new Person();
        int hashCode = person.hashCode();
        //假如当前hashcode的二进制是:1010011000001010000011010001010
        //1010011000001010000011010001010
        //0000000000000000000000000001111
        //结果1010 所以最终值的大小是在0到2的4次方减一之间 刚好覆盖了数组的所有索引值
        String s = Integer.toBinaryString(hashCode);
        String s1 = Integer.toBinaryString(hashCode & (16-1));
        Integer integer = Integer.valueOf(s1, 2);
        System.out.println();
    }

`在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值