zoukankan      html  css  js  c++  java
  • HashMap(JDK1.8)的容量为什么是2的n次方

    1.提高计算效率

    我们知道HashMap底层是数组+链表+红黑树,确定元素在数组的哪个位置上需要用到hash值,计算公式如下:
    hash % length等价于(length - 1) & hash
    length:数组的长度即HashMap的容量
    hash:key的hash值
    这个等价的前提是length为2^n
    &比%快,所以为了效率,将length设为2^n

    2.提高扩容的效率

    当数组上某个位置是一个链表时,不需要像JDK1.7一样重新计算hash,只需要看原来的hash值新增的那个bit是1还是0就好了,如果是0索引没变,如果是1索引变成“原索引+原容量”

    ps:扩容为原来的2倍还有一个特点就是,扩容后元素要么在原位置,要么在原位置移动2次幂的位置
    比如有两个元素ABA的hashCode = 100,B的hashCode = 115。有个HashMap原来的容量是16,现在扩容为32.
    那么在扩容前:A在数组中的索引为100%16=4,B在数组中的索引为115%16=3
    扩容后:A在数组中的索引为100%32=4,B在数组中的索引为115%32=19
    可以看到A在扩容前后索引没变,B扩容后索引变为了19,也就是原索引+原容量

  • 相关阅读:
    FileWriter写数据路径问题及关闭和刷新方法的区别
    FileWriter剖析
    2018-10-27 22:44:33 c language
    2018-10-23 23:29:54 clanguage
    Just write about
    2018-10-19 00:13:35 ArrayList
    2018-10-18 22:15:32 c language
    Why do collection classes appear
    2018-10-17 22:20:39 c language
    2018-10-16 22:56:13 c language
  • 原文地址:https://www.cnblogs.com/liuwhut/p/13267711.html
Copyright © 2011-2022 走看看