当前位置: 首页 > 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操作

http://www.dtcms.com/a/68760.html

相关文章:

  • 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
  • QT编程之QGIS
  • 【Flutter】数据库实体类构造函数加密注意事项
  • 深度学习有哪些算法?
  • 30、map 和 unordered_map的区别和实现机制【高频】
  • FreeRTOS之信号量
  • 【后端】【django】Django DRF `@action` 详解:自定义 ViewSet 方法
  • 微信小程序实现根据不同的用户角色显示不同的tabbar并且可以完整的切换tabbar
  • 母婴商城系统Springboot设计与实现
  • 冠珠瓷砖×郭培“惟质致美”品质主题片上映,讲述高定艺术背后的致美品质故事
  • SSM基础专项复习5——Maven私服搭建(2)