• HashMap


    先甩出疑问,以后明白了再记录。

    1,为什么java数组的长度需要是2的n次幂?

    2,为什么hash方法需要把高位和低位做异或操作?

    3,多线程使用hashMap怎么把链表rehash成循环结构?

    HashMap的数据结构是java数据和桶结构。一个桶可以是链表,或者红黑树。由Node或者TreeNode节点组成。

    影响HashMap性能的参数,initCapacity,load factor。HashMap中java数组的长度总是大于等于capacity的2的n次幂;load factor用来决定hashMap扩容的时机。当size大于threshold和loadFactor的乘积,hashMap会扩容。 size(key-value个数)(threshold  java数组长度)loadFactor(推荐默认值0.75)

        /**
         * Returns a power of two size for the given target capacity.
         */
        static final int tableSizeFor(int cap) {
            int n = cap - 1;
            n |= n >>> 1;
            n |= n >>> 2;
            n |= n >>> 4;
            n |= n >>> 8;
            n |= n >>> 16;
            return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
        }
    

      

                if (table == null) { // pre-size
                    float ft = ((float)s / loadFactor) + 1.0F;
                    int t = ((ft < (float)MAXIMUM_CAPACITY) ?
                             (int)ft : MAXIMUM_CAPACITY);
                    if (t > threshold)
                        threshold = tableSizeFor(t);
                }
    

      

    HashMap不支持多线程,直接使用put,get等接口肯定有 类似 脏读、更新丢失的问题。我了解到有一种说法,多线程使用hashMap怎么把链表rehash成循环结构。这一点并没有理解是怎么发生的。总之HashMap对多线程是不安全的。多线程需要使用ConcurrentHashMap。

    hash冲突。 当java数组中某个位置的元素大于一定数量的时候,桶的结构从链表转换成红黑树。当key的hashCode冲突严重的时候,需要提供Compare接口。

                if (binCount >= TREEIFY_THRESHOLD - 1)
                    treeifyBin(tab, hash);
    

      

  • 相关阅读:
    Virtuabox 虚拟机克隆方法
    CentOS 7 防火墙 出现Failed to start iptables.service: Unit iptables.service failed to load
    Linux系统下安装rz/sz命令及使用说明
    os、sys模块
    collections、random、hashlib、configparser、logging模块
    time、datatime模块
    正则表达式、re模块
    递归、二分查找法
    内置函数、匿名函数
    生成器进阶、生成器表达式
  • 原文地址:https://www.cnblogs.com/afraidToForget/p/10116571.html
Copyright © 2020-2023  润新知