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

      

  • 相关阅读:
    python epoll
    解决linux下/etc/rc.local开机器不执行的原因
    xen4.1.2网桥配置
    用户激励设计[转]
    C#4.0的dynamic和var及object关键字辨析
    动态设置和修改Membership/Profile/RoleProvider的ConnectionString数据库连接字符串
    UseCase用例怎么画_UML用例UseCase的几个理解误区
    C#的delegate/event/Action/Func/Predicate关键字
    我为什么鄙视提倡加班的公司
    [转]个人成长之通关路!
  • 原文地址:https://www.cnblogs.com/afraidToForget/p/10116571.html
Copyright © 2020-2023  润新知