本次 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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?