zoukankan      html  css  js  c++  java
  • hashmap为什么初始容量是2的指数幂

    1.hashmap在确定元素落在数组的位置的时候,计算方法是(n - 1) & hash,n为数组长度也就是初始容量 ,这是因为“取模”运算的消耗还是比较大的,那么如何保证(n - 1) & hash和hash%n的结果相同呢,当n为2的指数次幂时,会满足一个公式:(n - 1) & hash = hash % n,这样就可以用(n - 1) & hash的位运算来使计算更加高效。
     
    2.如果初始容量是奇数,那么(n-1)就为偶数,偶数2进制的结尾都是0,经过hash值&运算后末尾都是0,那么0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这样就会造成空间的浪费而且会增加hash冲突。
     
    3. 只有是2的指数次幂的数字经过n-1之后,二进制肯定是  ...11111111  这样的格式,这种格式计算的位置的时候,完全是由产生的hash值类决定,而不受n-1 影响。这样会提高效率。比如要扩容了,2的幂次方*2,在二进制中比如4和8,代表2的2次方和3次方,他们的2进制结构相 似,比如 4和8   00000100    0000 1000   只是高位向前移了一位,这样扩容的时候,只需要判断高位hash,移动到之前位置的倍数就可以了,免去了重新计算位置的运算。并且这样可以保证(n - 1) & hash得到的存储位置是在hashmap的length之内的,也就是n之内。因为最大也就是hash值也全是...1111111

  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/wl889490/p/12696312.html
Copyright © 2011-2022 走看看