zoukankan      html  css  js  c++  java
  • 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);
    

      

  • 相关阅读:
    武汉大学数学专业考研试题参考解答
    中山大学数学专业考研试题参考解答
    北京大学数学专业考研试题参考解答汇总
    一些泛函分析题目
    人生感言
    数学分析高等代数考研试题荟萃[更新至2017年12月28日]
    数学分析高等代数考研试题荟萃[更新至2017年12月15日]
    2017-2018-1 实变函数
    2017-2018-1 点集拓扑
    Latex "Error: Extra alignment tab has been changed to cr. "
  • 原文地址:https://www.cnblogs.com/afraidToForget/p/10116571.html
Copyright © 2011-2022 走看看