当前位置: 首页 > news >正文

HashMap ,HashTable , ConcurrentHashMap 面试

双列集合

HashMap 线程不安全的

HashMap 允许键和值为 null。不过要留意,HashMap 并非线程安全的,在多线程环境下使用可能会出现问题。

数组链表+红黑树          jdk1.8

双列集合 存储keyvalue 底层数组的形式存在,初始值 为16 也可以在new HashMap的时候指定HashMap的大小new出来的大小是2的幂次方 负载因子为0.75

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4

数组中每一个元素称为hash桶 每次put一个元素时根据它的key算出它的hashcode 然后对数组的长度取余算出他在哪个位置,如果该位置hash桶没有东西则直接放,如果该位置有,,则通过eques方法比较如果key相同,则更新value如果不同则再放,如果放的时候该位置的痛的数量没有超过8,则通过尾差发放上去,如果超过8,则判断数组的大小有没有超过64,如果超过64,则转为红黑树,没有超过64则将数组的长度扩容至两倍,扩容时采取数据迁移,将原来的链表挪到新数组上去, 不是复制,也不是直接全部挪,jdk1.7将该rehash 重新取模

jdk1.8通过位运算符 hash& 你的老数组长度

低位元素依然放到原来的位置,然后高位放在原来的+扩容的长度

Hashtable是线程安全的,方法上都加了锁 假如有两个线程同时读,也只能一个一个的读,并发效率低

Hashtable同样不允许键或值为null。它也是线程安全的,在设计时就不支持null,若尝试插入null键或值,会抛出NullPointerException

ConcurrentHashMap 线程安全(分段锁)将锁的粒度进一步细化,提高并发效率

ConcurrentHashMap不允许键或值为null。因为它是线程安全的,设计时为了避免在多线程环境下出现NullPointerException等问题,所以不支持null 避免歧义

 如果该节点没有值,并且没有锁,则采用cas比较并交换思想,实现多线程的put操作

相关文章:

  • C++ primer plus 内存模型和命名空间下
  • OSC32IN与OSC32OUT对于无源晶振而言有区别吗?
  • 数字滤波器的设计实现及应用(论文+仿真)
  • 在教育领域的大模型知识引擎 × DeepSeek应用
  • 显示模组bonding缺划专案
  • RabbitMQ入门:从安装到高级消息模式
  • SWPU 2022 新生赛
  • Fisher准则例题
  • 【大语言模型】【个人知识库正式内容】提示工程:如何设计模型的提示语
  • Linux操作系统下Git的使用详细步骤
  • 什么是mysql索引回表?
  • jmeter-sample
  • 论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • 自定义MDCAdapter,进行线程池级别的日志ID传递
  • 安装 Powerlevel10k 及 Oh My Zsh 的使用
  • opencascade 源码学习几何变换 BRepBuilderAPI-BRepBuilderAPI_Transform
  • 【GB28181】RTSP服务器传输AAC音频
  • JVM垃圾收集器相关面试题(1)
  • WPS 接入 DeepSeek-R1 深度实践:打造全能AI办公助手
  • VXLAN 组播 RP
  • 长三角议事厅·周报|新能源汽车产业需寻求“第二增长曲线”
  • 家庭医生可提前5天预约三甲医院号源,上海常住人口签约率达45%,
  • 持续降雨存在落石风险,贵州黄果树景区水帘洞将封闭至6月初
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途
  • 101岁陕西省军区原司令员冀廷璧逝世,曾参加百团大战
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部