zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    谷歌浏览器解决跨域
    实现Linux共享Window文件
    linux安装显卡驱动
    jsduck 文档生成器
    linux 笔记
    Linux phpstorm 无法输入中文
    linux 安装composer
    Extjs动态生成表头(适用报表)
    关于git的配置与使用
    JSP解决中文乱码问题
  • 原文地址:https://www.cnblogs.com/devilwind/p/8759666.html
Copyright © 2011-2022 走看看