- HashMap组成原理
HashMap是Java中常用的数据结构,是基于哈希表实现的
- JDK1.2-JDK1.7 数组+链表,HashMap内部使用Entry[]来存储键值对,发生哈希冲突时,采用链式解决方法,每个桶(bucket)维护一个单项链表存储hash值相同的元素,插入链表采用头插法。
- JDK1.8之前 数组+链表/红黑树,桶中元素超过阈值(默认8),且容器容量大于等于64时,将原本的单向链表转换为红黑树,提高插入和查找效率
- JDK1.8 数组+链表/红黑树/跳表(Skip List),若配置了-XX:+UseJumpConsistentHash参数,则优先转换为跳表。否则同JDK1.8之前
- 介绍一下哈希冲突
使用哈希表进行数据存储时,不同键值对映射到相同的散列表索引位置
- 介绍一下HashTable
- HashTable的每个方法都修饰了sychronized,保证了线程安全,但读写效率低
- key和value都不能为null
- 可以理解为加了线程安全的HashMap,但JDK1.2前使用数组+链表,JDK1.3以后为数组+链表/红黑树
- 介绍一下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
蓝光水母
阅读(
33)
评论()
编辑
收藏
举报