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

      

  • 相关阅读:
    Golang 函数,我觉得比较有意思的几个东西
    Golang 基础
    JVM快速扫盲篇
    好用的Scrum (敏捷开发)工具有哪些?推荐三个顶级的Scrum 管理工具
    一篇文章帮助你理解跑马灯的滚动原理
    如何来理解Python中的字典数据类型
    一篇文章带你了解HTML的网页布局结构
    通过webgoat-xxe、jwt学习Java代码审计
    DNS隧道
    KTL 一个支持C++14编辑公式的K线技术工具平台
  • 原文地址:https://www.cnblogs.com/afraidToForget/p/10116571.html
Copyright © 2011-2022 走看看