ConcurrentHashmap面试【高频】

  1. ConcurrentHashmap的key,value是否可以为null?为什么?
    不行,如果key或者value为null会抛出空指针异常。
    原因:null具有二义性问题,没办法确定存储值本身是null,还是说值不存在(因为默认是null)->就理解为多线程会不安全就行,HashMap可以是因为单线程
  2. 1.8的扩容允许多线程吗?
    可以。
    当put的时候,发现当前node hash值是-1,则表示当前的节点正在扩容,则会触发协助扩容机制:
    扩容就是搬迁Node,就是会维护一个transferIndex变量,来的线程死循环cas争抢下标,如果下标已经分配完了,如果cas抢到了要搬运的下标,就去帮忙搬就行

其中几个数据:

  • 参与搬迁的线程数不会多余CPU数
  • 每个线程至少负责16个槽位的搬迁
    • 如果ConcurrentHashMap只有16个槽,只会有一个线程来负责搬
    • 如果大于16,由CPU来进行分配,使用CAS来争抢下标。结果:至少1个线程,最多2个线程来负责(32的情况)

Java8 链表转红黑树(8)和红黑树链表(6)为什么是8和6?

红黑树所占的空间虽然是链表中Node所占空间的两倍,虽然红黑树的**查找效率为o(logN),要优化链表的o(N),**但是当链表的长度比较小的时候,即使全部遍历,时间复杂度也不会太高。

->所以需要寻找一个时间和空间的平衡,即在链表长度达到一个阈值之后再转换为红黑树。

  • **之所以是8,**这个是研究者研究哈希碰撞的泊松分布,发现逐渐降低了->基本上不可能碰撞,如果发生了8次,这个时候说明由于元素本身和hash函数的原因
  • 链表的阈值是6 ,主要是因为如果也将阈值设置为8,那么当hash碰撞在8时,会发生链表和红黑树的不停相互激荡转换,白白浪费资源。中间有个差值7可以防止链表和树之间的频繁转换
相关推荐
JaJian.几秒前
Java后端服务假死问题排查与解决
java·开发语言
救赎小恶魔2 分钟前
C++算法(5)
java·c++·算法
重生之后端学习42 分钟前
236. 二叉树的最近公共祖先
java·数据结构·算法·职场和发展·深度优先
Sun_gentle1 小时前
java.lang.RuntimeException: Could not load wrapper properties from ‘C:\Users\
java·开发语言·安卓
2501_901147831 小时前
有序数组单一元素查找:从通用解法到算法极致优化——兼谈高性能计算基础思路
算法·面试·职场和发展
笨蛋不要掉眼泪1 小时前
Nacos配置中心详解:核心用法、动态刷新与经典面试题解析
java·数据库·后端
橙露1 小时前
面向对象编程思想:Java 与 Python 的封装、继承与多态对比分析
java·开发语言·python
上海合宙LuatOS1 小时前
LuatOS核心库API——【io】 io操作(扩展)
java·服务器·前端·网络·单片机·嵌入式硬件·物联网
ShineWinsu1 小时前
对于C++:模版进阶的解析
开发语言·c++·面试·笔试·求职·进阶·模版
追随者永远是胜利者1 小时前
(LeetCode-Hot100)42. 接雨水
java·算法·leetcode·职场和发展·go