• HashMap笔记


    大纲和问题:

    • 核心数据结构,(为什么链表长度大于8后,链表会转红黑树?)
    • 初始化容量为什么是2的指数幂?加载因子为什么是0.75
    • jdk7的hashmap扩容死锁与环链行程分析
    • jdk8扩容优化,如何做到扩容无需rehash
    • ConcurrentHashMap线程安全吗?什么是分段锁?

    笔记:

    • 数据结构:数组+链表+红黑树(>1.7)
      正常的是数组结构,出现hash碰撞则会出现链表,链表长度大于8则会出现红黑树,因为普通链表的查询效率比数组低的多,但是红黑树插入性能很低(左旋右旋,重新着色);为什么是8呢,从概率上来说(泊松分布),同一个位置出现相同的key的概率会越来越低,达到8的时候,已经很低了,这里转红黑树对插入效率影响较小,且可以提高查询效率;
    • 链表的长度>=8链表转红黑树
    • 初始化容量为什么是2的指数幂:hashmap定位使用的是位运算,而位运算比取模效率高得多,为了保证位运算和取模效果相同,容量大小最好是2的指数幂,关键代码:indexFor(hash, table.length)
    • 加载因子为什么是0.75?如果设置为1,则hash碰撞概率增大,查询效率变慢;如果设置的太小,则空间利用率太低,浪费空间
  • 相关阅读:
    1334: 好老师
    poj 2255 Tree Recovery
    2006浙大:简单计算器
    POJ1001(C++处理大数)
    HDU2159(二维完全背包)
    POJ2080:Calendar(计算日期)
    2008上交:Day of Week
    POJ1365:质因数分解
    VIJOS:P1706(舞会)
    POJ2449:K短路
  • 原文地址:https://www.cnblogs.com/yinchh/p/12729360.html
Copyright © 2020-2023  润新知