Java中为什么hashMap要强制size为2的n次方

如果hashMap不强制size为2的n次方,那么随着size的不同出现的碰撞分布为:

import java.util.HashMap;
import java.util.Map;

public class TestHashCrash {
    public static void main(String[] args) {
        for (int i = 1; i <= 32; i++) {
            System.out.println("size为" + i + ":" + demo(i));
        }
    }

    // threshold可以理解为HashMap设置的初始大小
    private static Map demo(int threshold) {
        //填充Map
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < threshold; i++) {
            map.put(i, 0);
        }
        //i 可以理解为 key 计算出来的hashCode
        for (int i = 0; i < 1000; i++) {
            int index = i & (threshold - 1);   // 替代重点
            map.put(index, map.get(index) + 1);
        }
        return map;
    }
}
size为1:{0=1000}
size为2:{0=500, 1=500}
size为3:{0=500, 1=0, 2=500}
size为4:{0=250, 1=250, 2=250, 3=250}
size为5:{0=500, 1=0, 2=0, 3=0, 4=500}
size为6:{0=250, 1=250, 2=0, 3=0, 4=250, 5=250}
size为7:{0=250, 1=0, 2=250, 3=0, 4=250, 5=0, 6=250}
size为8:{0=125, 1=125, 2=125, 3=125, 4=125, 5=125, 6=125, 7=125}
size为9:{0=504, 1=0, 2=0, 3=0, 4=0, 5=0, 6=0, 7=0, 8=496}
size为10:{0=252, 1=252, 2=0, 3=0, 4=0, 5=0, 6=0, 7=0, 8=248, 9=248}
size为11:{0=252, 1=0, 2=252, 3=0, 4=0, 5=0, 6=0, 7=0, 8=248, 9=0, 10=248}
size为12:{0=126, 1=126, 2=126, 3=126, 4=0, 5=0, 6=0, 7=0, 8=124, 9=124, 10=124, 11=124}
size为13:{0=252, 1=0, 2=0, 3=0, 4=252, 5=0, 6=0, 7=0, 8=248, 9=0, 10=0, 11=0, 12=248}
size为14:{0=126, 1=126, 2=0, 3=0, 4=126, 5=126, 6=0, 7=0, 8=124, 9=124, 10=0, 11=0, 12=124, 13=124}
size为15:{0=126, 1=0, 2=126, 3=0, 4=126, 5=0, 6=126, 7=0, 8=124, 9=0, 10=124, 11=0, 12=124, 13=0, 14=124}
size为16:{0=63, 1=63, 2=63, 3=63, 4=63, 5=63, 6=63, 7=63, 8=62, 9=62, 10=62, 11=62, 12=62, 13=62, 14=62, 15=62}
size为17:{0=504, 1=0, 2=0, 3=0, 4=0, 5=0, 6=0, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=496}
size为18:{0=252, 1=252, 2=0, 3=0, 4=0, 5=0, 6=0, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=248, 17=248}
size为19:{0=252, 1=0, 2=252, 3=0, 4=0, 5=0, 6=0, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=248, 17=0, 18=248}
size为20:{0=126, 1=126, 2=126, 3=126, 4=0, 5=0, 6=0, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=124, 17=124, 18=124, 19=124}
size为21:{0=252, 1=0, 2=0, 3=0, 4=252, 5=0, 6=0, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=248, 17=0, 18=0, 19=0, 20=248}
size为22:{0=126, 1=126, 2=0, 3=0, 4=126, 5=126, 6=0, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=124, 17=124, 18=0, 19=0, 20=124, 21=124}
size为23:{0=126, 1=0, 2=126, 3=0, 4=126, 5=0, 6=126, 7=0, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=124, 17=0, 18=124, 19=0, 20=124, 21=0, 22=124}
size为24:{0=63, 1=63, 2=63, 3=63, 4=63, 5=63, 6=63, 7=63, 8=0, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=62, 17=62, 18=62, 19=62, 20=62, 21=62, 22=62, 23=62}
size为25:{0=256, 1=0, 2=0, 3=0, 4=0, 5=0, 6=0, 7=0, 8=248, 9=0, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=248, 17=0, 18=0, 19=0, 20=0, 21=0, 22=0, 23=0, 24=248}
size为26:{0=128, 1=128, 2=0, 3=0, 4=0, 5=0, 6=0, 7=0, 8=124, 9=124, 10=0, 11=0, 12=0, 13=0, 14=0, 15=0, 16=124, 17=124, 18=0, 19=0, 20=0, 21=0, 22=0, 23=0, 24=124, 25=124}
size为27:{0=128, 1=0, 2=128, 3=0, 4=0, 5=0, 6=0, 7=0, 8=124, 9=0, 10=124, 11=0, 12=0, 13=0, 14=0, 15=0, 16=124, 17=0, 18=124, 19=0, 20=0, 21=0, 22=0, 23=0, 24=124, 25=0, 26=124}
size为28:{0=64, 1=64, 2=64, 3=64, 4=0, 5=0, 6=0, 7=0, 8=62, 9=62, 10=62, 11=62, 12=0, 13=0, 14=0, 15=0, 16=62, 17=62, 18=62, 19=62, 20=0, 21=0, 22=0, 23=0, 24=62, 25=62, 26=62, 27=62}
size为29:{0=128, 1=0, 2=0, 3=0, 4=128, 5=0, 6=0, 7=0, 8=124, 9=0, 10=0, 11=0, 12=124, 13=0, 14=0, 15=0, 16=124, 17=0, 18=0, 19=0, 20=124, 21=0, 22=0, 23=0, 24=124, 25=0, 26=0, 27=0, 28=124}
size为30:{0=64, 1=64, 2=0, 3=0, 4=64, 5=64, 6=0, 7=0, 8=62, 9=62, 10=0, 11=0, 12=62, 13=62, 14=0, 15=0, 16=62, 17=62, 18=0, 19=0, 20=62, 21=62, 22=0, 23=0, 24=62, 25=62, 26=0, 27=0, 28=62, 29=62}
size为31:{0=64, 1=0, 2=64, 3=0, 4=64, 5=0, 6=64, 7=0, 8=62, 9=0, 10=62, 11=0, 12=62, 13=0, 14=62, 15=0, 16=62, 17=0, 18=62, 19=0, 20=62, 21=0, 22=62, 23=0, 24=62, 25=0, 26=62, 27=0, 28=62, 29=0, 30=62}
size为32:{0=32, 1=32, 2=32, 3=32, 4=32, 5=32, 6=32, 7=32, 8=31, 9=31, 10=31, 11=31, 12=31, 13=31, 14=31, 15=31, 16=31, 17=31, 18=31, 19=31, 20=31, 21=31, 22=31, 23=31, 24=31, 25=31, 26=31, 27=31, 28=31, 29=31, 30=31, 31=31}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值