• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
haipali
博客园    首页    新随笔    联系   管理    订阅  订阅

Java基础 -- HashMap

  1. HashMap组成原理
    HashMap是Java中常用的数据结构,是基于哈希表实现的
  • JDK1.2-JDK1.7 数组+链表,HashMap内部使用Entry[]来存储键值对,发生哈希冲突时,采用链式解决方法,每个桶(bucket)维护一个单项链表存储hash值相同的元素,插入链表采用头插法。
  • JDK1.8之前 数组+链表/红黑树,桶中元素超过阈值(默认8),且容器容量大于等于64时,将原本的单向链表转换为红黑树,提高插入和查找效率
  • JDK1.8 数组+链表/红黑树/跳表(Skip List),若配置了-XX:+UseJumpConsistentHash参数,则优先转换为跳表。否则同JDK1.8之前
  1. 介绍一下哈希冲突
    使用哈希表进行数据存储时,不同键值对映射到相同的散列表索引位置
  2. 介绍一下HashTable
  • HashTable的每个方法都修饰了sychronized,保证了线程安全,但读写效率低
  • key和value都不能为null
  • 可以理解为加了线程安全的HashMap,但JDK1.2前使用数组+链表,JDK1.3以后为数组+链表/红黑树
  1. 介绍一下ConcurrentHashMap
  • 作为HashTable的替代,优化了性能、可扩展性and并发控制
  • jdk1.7 ReentrantLock+Segment+HashEntry,采用分段锁机制,每个分段相当于小HashMap,每个分段加锁;jdk1.8 synchronized+CAS+Node+红黑树,synchronized由于效率比CAS低,所以仅在哈希冲突或扩容等CAS无法使用的情况下才启用,其在链表的头节点加锁,使锁粒度更细,效率更高,新增Node节点,增加了volatile修饰,保证数据的可见性与有序性
  • 采用二次hash,先定位到桶再定位到元素所在位置
posted @ 2023-03-14 15:25  蓝光水母  阅读(44)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3