您当前的位置: 首页 > 

蔚1

暂无认证

  • 0浏览

    0关注

    4753博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

HashMap 与 ConcurrentHashMap(技术篇)

蔚1 发布时间:2018-04-12 10:43:55 ,浏览量:0

本次 Chat 内容包括:

  • Hashmap 在 1.8 后有哪些变化,性能如何进行了大幅度提升?
  • 红黑树和链表在哪些情况会相互转化?
  • ConcurrentHashMap 在 1.8 后有哪些变化?
  • 什么是 CAS,锁同步消耗资源和无锁算法究竟哪个更合适?
  • 仿照 ConcurrentHashMap 源码,我们可以借鉴哪些并发编程思维?
  • 面试中常问到问题汇总--->独家经验

半年前写过《JAVA8 hashmap 源码阅读笔记》,总阅读量将5000。大家可以先看看。。

HashMap 简述

        HashMap 是由于数组+链表组成,数组默认初始容量为 16,Hash 表每次扩容都变为原来的两倍,默认负载因子的大小为0.75(若小于0,抛异常),负载因子是表示一个散列表的空间的使用程度,有这样一个公式:数组容量*负载因子大小=HashMap的容量,如果负载因子是默认的0.75,HashMap(16)的时候,占16个内存空间,实际上只用到了12个,超过12个就扩容(后面介绍,扩容操作及其耗费时间)。如果负载因子是1的话,HashMap(16)的时候,占16个内存空间,实际上会填满16个以后才会扩容。

JAVA8 中 HashMap 有哪些优化呢?

JAVA8 提出 Lambda 表达式,并提供全面支持集合类。

JAVA8 以前循环 Map 常用遍历方式:

    for (String string : map.keySet()) {        System.out.println(string + map.get(string));    }

JAVA8 新循环 Map 常用遍历方式:

    map.forEach((k,v) -> System.out.println(k + v));

以上是 Java8 的遍历写法,是不是很便捷呢?关于 JAVA8Lambda 表达式可以看JAVA 8 Lambda详解。        在 JAVA8 后底层优化链表,当发生 Hash 冲突时,冲突位置链表长度达8(可修改)时,将链表转化为红黑树,若发生冲突位置红黑树元素少于6(可修改)时,将红黑树转化为链表。也就是在发生冲突达到一定程度时。使用红黑树查找,删除的效果都比链表平均好很多。

HashMap 方法浅析

put 方法:算出 Hash 码值,查找指定地点是否发生 Hash 冲突,若发生冲突则继续判断,若 key 值相同,则用新的 Value 值替换之,若冲突位置已经是红黑树,按照红黑树方式,插入 key、Value。否则循环链表到尾端,若此时链表内元素大于等于7且表内元素数大于,将链表转化为红黑树,将值插入,将 size + 1,若超过最大值(数组容量*负载因子大小),则扩容,将容量扩容为2倍,将表内元素全部重新插入。get方法:算出 Hash 码值,若 Map 不为空,Size 不为0,若不存在返回 null,若调用 equal 相同,直接返回,否则链表向下循环,红黑树,采用红黑树高效查找方式查找。remove方法:按照 get 方法查找方式,若找到该节点,将该节点移除。foreach方法:

public final void forEach(Consumer            
关注
打赏
1560489824
查看更多评论
0.0564s