• HashMap实现原理和底层数据结构?


    1 底层数据结构

    数组(主体) + 链表(解决哈希冲突)

    2 实现原理

    HashMap 的主干是一个Entry数组,初始值是一个空数组 {}

    Entry是HashMap的基本组成单元,每一个Entry包含一个 key-value 键值对。 

    HashMap 整体结构   

    Entry源码

    static class Entry<K,V> implements Map.Entry<K,V> {
            final K key;
            V value;
            Entry<K,V> next;//存储指向下一个Entry的引用,单链表结构
            int hash;//对key的hashcode值进行hash运算后得到的值,存储在Entry,避免重复计算
    
            /**
             * Creates new entry.
             */
            Entry(int h, K k, V v, Entry<K,V> n) {
                value = v;
                next = n;
                key = k;
                hash = h;
            }     

    HashMap源码中其他几个重要字段

    //实际存储的key-value键值对的个数
    transient int size;
    //阈值,当table == {}时,该值为初始容量(初始容量默认为16);当table被填充了,也就是为table分配内存空间后,threshold一般为 capacity*loadFactory。HashMap在进行扩容时需要参考threshold,后面会详细谈到
    int threshold;
    //负载因子,代表了table的填充度有多少,默认是0.75
    final float loadFactor;
    //用于快速失败,由于HashMap非线程安全,在对HashMap进行迭代时,如果期间其他线程的参与导致HashMap的结构发生变化了(比如put,remove等操作),需要抛出异常ConcurrentModificationException
    transient int modCount;

    key 到 数组下标的转换

    当发生哈希冲突并且size大于阈值(threshold)的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。

      参考链接:https://www.cnblogs.com/chengxiao/p/6059914.html        

  • 相关阅读:
    【bzoj1149】 [CTSC2007]风玲Mobiles
    C++-POJ1915-Knight Moves[BFS]
    C++-蓝桥杯-小计算器[进制转化][模拟]
    C++-蓝桥杯-矩阵乘法[快速幂]
    C++-蓝桥杯-入门训练
    C++-POJ1502-MPI Maelstrom-[最短路][spfa][栈优化]
    C++-POJ3070-Fibonacci-[矩阵乘法][快速幂]
    C++-POJ3213-PM3-[矩阵乘法]
    C++-POJ3233-Matrix Power Series[矩阵乘法][快速幂]
    C++-POJ3735-Training little cats[矩阵乘法][快速幂]
  • 原文地址:https://www.cnblogs.com/starinbrook/p/9383283.html
Copyright © 2020-2023  润新知