• hashMap为啥初始化容量为2的次幂


    原文 https://blog.csdn.net/sd_csdn_scy/article/details/57083619
    hashMap源码获取元素的位置:
    
    
    static int indexFor(int h, int length) {
        // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
    return h & (length-1);
    }
    解释:
    h:为插入元素的hashcode
    length:为map的容量大小
    &:与操作 比如 1101 & 1011=1001
    如果length为2的次幂  则length-1 转化为二进制必定是11111……的形式,在于h的二进制与操作效率会非常的快,
    而且空间不浪费;如果length不是2的次幂,比如length为15,则length-1为14,对应的二进制为1110,在于h与操作,
    最后一位都为0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,减慢了查询的效率!这样就会造成空间的浪费
     PS: 这都是老版本jdk的源码,1.7,8之后都没有这个方法了, 但是计算位置index的思想不变,就是要充分散列,减少碰撞
    下面是1.8的代码
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                       boolean evict) {
            Node<K,V>[] tab; Node<K,V> p; int n, i;
            if ((tab = table) == null || (n = tab.length) == 0)
                n = (tab = resize()).length;
            if ((p = tab[i = (n - 1) & hash]) == null)   //计算index
                tab[i] = newNode(hash, key, value, null);
  • 相关阅读:
    第18章 检测点模型
    第17章 发现过拟合和欠拟合
    第16章 学习速率调度器
    第15章 MiniVGGNet:更深的CNNs
    第14章 LeNet:识别手写数字
    第13章保存和加载你的模型
    第12章 训练你的第一个CNN
    Vue.js
    python3第一天
    R+JAVA 中文乱码问题
  • 原文地址:https://www.cnblogs.com/devilwind/p/8759666.html
Copyright © 2020-2023  润新知