Java8中HashMap分析

Put方法流程图

特殊值

hash

高16bit不变,低16bit和高16bit做了一个异或

 static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

size

  • map中存储的KV数目
  • 值为2的n次幂
    • 哈希表是通过除法散列法,取模会用到除法运算,效率很低,而HashMap通过 h&(length-1)替代取模
    • length 为2的整数次幂,是为了使不同hash值发生碰撞概率小即更均匀散列
    • length 的值为100..0,length-1为011..1,相当于对取模,而且保证了hash可以奇偶都有

threshold

  • 阀值,=容量*loadFactor(负载因子,默认0.75)

扩容机制

  • hash与旧链表大小做 & 运算,=0不变,=1移动到原位置+旧链表大小的位置


线程是否安全

  • JDK1.7,扩容前后链表导致,转移过程中修改了原来链表中节点引用关系,可能导致死循环
  • JDK1.8,不会引起死循环,但put/get不一定同步
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 6,714评论 9 107
  • 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Deve...
    王帅199207阅读 1,411评论 0 109
  • 一声长鸣! 伴随我踏上这列让我惧怕的列车。 心里酸酸的, 想起曾经的我! 还有我的爱人! 我们一起不知在多少次列车...
    央苗清阅读 212评论 0 2
  • 最典型的例子莫过于挑选装修公司了。平均每户装修者在确定装修公司前,一般会同时让2-5家装修公司做预算,哪家预算做得...
    翻新哥阅读 116评论 0 0
  • Q:默认的销售模块。要创建客户时候显示应收账款,应付账款没填写。但是在表单视图中没有显示。 因为需要设置默认对会计...
    F4A3阅读 566评论 0 0