【Java自顶向下】ConcurrentHashMap面试题(2021最新版)
文章目录
- 1 ConcurrentHashMap默认初始容量是多少?
- 2 ConCurrentHashmap 的key,value是否可以为null。
- 3 ConCurrentHashmap 每次扩容是原来容量的几倍
- 4 ConCurrentHashmap的数据结构是怎么样的?(后面会具体分析它的put方法)
- 5 存储在ConCurrentHashmap中每个节点是什么样的,有哪些变量
- 6 ConCurrentHashmap的put过程是怎样的?
- 7 java1.8中ConCurrentHashmap节点是尾插还是头插?
- 8 java1.8中,ConCurrentHashmap什么情况下链表才会转换成红黑树进行存储?
- 9 java1.8中,ConCurrentHashmap的get过程是怎样的?
- 10 java1.8中,ConCurrentHashmap是如何计算它的size大小的?
- 11 ConcurrentHashMap有哪些构造函数?
- 12 ConcurrentHashMap使用什么技术来保证线程安全?
- 13 ConcurrentHashMap的get方法是否要加锁,为什么?
- 14 ConcurrentHashMap迭代器是强一致性还是弱一致性?HashMap呢?
- 15 ConcurrentHashMap1.7和1.8的区别
1 ConcurrentHashMap默认初始容量是多少?
从下面ConcurrentHashMap类的静态变量可以看出它的初始容量为16
2 ConCurrentHashmap 的key,value是否可以为null。
不行 如果key或者value为null会抛出空指针异常
3 ConCurrentHashmap 每次扩容是原来容量的几倍
2倍 在transfer方法里面会创建一个原数组的俩倍的node数组来存放原数据。
4 ConCurrentHashmap的数据结构是怎么样的?(后面会具体分析它的put方法)
在java1.8中,它是一个数组+链表+红黑树的数据结构。
5 存储在ConCurrentHashmap中每个节点是什么样的,有哪些变量
它是实现Map.Entry<K,V>接口。里面存放了hash,key,value,以及next节点。它的value和next节点是用volatile进行修饰,可以保证多线程之间的可见性。
6 ConCurrentHashmap的put过程是怎样的?
整体流程跟HashMap比较类似,大致是以下几步:
(1)如果桶数组未初始化,则初始化;
(2)如果待插入的元素所在的桶为空,则尝试把此元素直接插入到桶的第一个位置;
(3)如果正在扩容,则当前线程一起加入到扩容的过程中;
(4)如果待插入的元素所在的桶不为空且不在迁移元素,则锁住这个桶(分段锁);
(5)如果当前桶中元素以链表方式存储,则在链表中寻找该元素或者插入元素;
(6)如果当前桶中元素以红黑树方式存储,则在红黑树中寻找该元素或者插入元素;
(7)如果元素存在,则返回旧值;
(8)如果元素不存在,整个Map的元素个数加1,并检查是否需要扩容;
添加元素操作中使用的锁主要有(自旋锁 + CAS + synchronized + 分段锁)。
7 java1.8中ConCurrentHashmap节点是尾插还是头插?
尾插法,见上述put方法。
8 java1.8中,ConCurrentHashmap什么情况下链表才会转换成红黑树进行存储?
链表长度大于8。数组长度大于64。从put源码和以下源码可以看出:并非一开始就创建红黑树结构,如果当前Node数组长度小于阈值MIN_TREEIFY_CAPACITY,默认为64,先通过扩大数组容量为原来的两倍以缓解单个链表元素过大的性能问题。
9 java1.8中,ConCurrentHashmap的get过程是怎样的?
1、计算 hash 值
2、根据 hash 值找到数组对应位置: (n - 1) & h
3、根据该位置处结点性质进行相应查找
如果该位置为 null,那么直接返回 null 就可以了
如果该位置处的节点刚好就是我们需要的,返回该节点的值即可
如果该位置节点的 hash 值小于 0,说明正在扩容,或者是红黑树,后面我们再介绍 find 方法如果以上 3 条都不满足,那就是链表,进行遍历比对即可
10 java1.8中,ConCurrentHashmap是如何计算它的size大小的?
对于size的计算,在扩容和addCount()方法就已经有处理了,可以注意一下Put函数,里面就有addCount()函数。
11 ConcurrentHashMap有哪些构造函数?
一共有五个,作用及代码如下:
//无参构造函数public ConcurrentHashMap() {}//可传初始容器大小的构造函数public ConcurrentHashMap(int initialCapacity) {if (initialCapacity < 0)throw new IllegalArgumentException();int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?MAXIMUM_CAPACITY :tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));this.sizeCtl = cap;}//可传入map的构造函数public ConcurrentHashMap(Map<? extends K, ? extends V> m) {this.sizeCtl = DEFAULT_CAPACITY;putAll(m);}//可设置阈值和初始容量public ConcurrentHashMap(int initialCapacity, float loadFactor) {this(initialCapacity, loadFactor, 1);}//可设置初始容量和阈值和并发级别public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel) {if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)throw new IllegalArgumentException();if (initialCapacity < concurrencyLevel) // Use at least as many binsinitialCapacity = concurrencyLevel; // as estimated threadslong size = (long)(1.0 + (long)initialCapacity / loadFactor);int cap = (size >= (long)MAXIMUM_CAPACITY) ?MAXIMUM_CAPACITY : tableSizeFor((int)size);this.sizeCtl = cap;}
12 ConcurrentHashMap使用什么技术来保证线程安全?
jdk1.7:Segment+HashEntry来进行实现的;
jdk1.8:放弃了Segment臃肿的设计,采用Node+CAS+Synchronized来保证线程安全;
13 ConcurrentHashMap的get方法是否要加锁,为什么?
不需要,get方法采用了unsafe方法,来保证线程安全。
14 ConcurrentHashMap迭代器是强一致性还是弱一致性?HashMap呢?
弱一致性,HashMap强一直性。
ConcurrentHashMap可以支持在迭代过程中,向map添加新元素,而HashMap则抛出了ConcurrentModificationException,因为HashMap包含一个修改计数器,当你调用他的next()方法来获取下一个元素时,迭代器将会用到这个计数器。
15 ConcurrentHashMap1.7和1.8的区别
jdk1.8的实现降低锁的粒度,jdk1.7锁的粒度是基于Segment的,包含多个HashEntry,而jdk1.8锁的粒度就是Node
数据结构:jdk1.7 Segment+HashEntry;jdk1.8 数组+链表+红黑树+CAS+synchronized
【Java自顶向下】ConcurrentHashMap面试题(2021最新版)相关推荐
- 非常详细的Redis面试题(2021最新版)
文章目录 概述 什么是Redis Redis有哪些优缺点 为什么要用 Redis /为什么要用缓存 为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 数据类型 Re ...
- java技术栈xmind,2021最新版!
前言 互联网时代,瞬息万变.一个小小的走错,就有可能落后于别人.我们没办法去预测任何行业.任何职业未来十年会怎么样,因为未来谁都不能确定.只能说只要有互联网存在,程序员依然是个高薪热门行业.只要跟随着 ...
- Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)
Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...
- 【2021最新版】Java多线程并发面试题总结(108道题含答案解析)
文章目录 JAVA并发知识库 1.Java中实现多线程有几种方法? 2.继承Thread类 3.实现Runnable接口. 4.ExecutorService.Callable.Future有返回值线 ...
- 【金三银四】Java集合面试题(2021最新版)
目录 前言 一.集合容器概述 1. 什么是集合 2. 集合的特点 3. 集合和数组的区别 4. 使用集合框架的好处 5. 常用的集合类有哪些? 6. List,Set,Map三者的区别? 7. 集合框 ...
- 【金三银四】Java中间件面试题(2021最新版)
目录 前言 Zookeeper 1. ZooKeeper 是什么? 2. ZooKeeper 提供了什么? 3.Zookeeper 文件系统 4. ZAB 协议? 5. 四种类型的数据节点 Znode ...
- Java 虚拟机(JVM)面试题(2021最新版)
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! Java内存区域 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为 ...
- Java基础知识面试题(2021最新版)
转载自:https://thinkwon.blog.csdn.net/article/details/104390612 文章目录 Java概述 何为编程 什么是Java jdk1.5之后的三大版本 ...
- Java 异常面试题(2021最新版)
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! Java异常架构与异常关键字 Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机 ...
- 【Java自顶向下】试手小公司,面试官问我ConcurrentHashMap,我微微一笑……
文章目录 ConcurrentHashMap 一.ConcurrentHashMap初始化的剖析 1.1 ConcurrentHashMap初始化 1.2 理解sizeCtl 二.JDK8的添加安全 ...
最新文章
- ubuntu java classpath_java – 如何为Ubuntu中的文件夹设置CLASSPATH变量
- spring整合junit问题分析
- Java面向对象--小游戏2
- python动态生成html报表_Python应用phy模块生成html表格
- 网页中JS函数自动执行常用三种方法
- animation 先执行一次 在持续执行_这一次,彻底弄懂 JavaScript 执行机制
- 信安考友分享:软考信息安全工程师备考四年,终成正果
- Tokenisation word segmentation sentence segmentation
- java直_java直连数据库小结
- 使用jpeglib直接把NV12转为jpeg文件的代码
- 动态规划——Weighted Interval Scheduling
- 自写:斤与公斤的转化
- 不能用float、double 存储金额——BigDecimal详解
- JavaScript中的三个点(...)扩展运算符
- JS在html中打印所有类型的数据
- python爬取学校题库_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!
- C语言>>有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。
- n 是什么意思 c语言,n在c语言中是什么意思
- c语言死机代码大全,最近在学C语言,有段代码一运行就死机,不知为何,求大神帮忙!...
- PySpark 踩坑百科全书