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);

  

原文地址:https://www.cnblogs.com/afraidToForget/p/10116571.html