java集合之Map

在Java中,Map是一种用于存储**键值对(Key-Value Pair)**的集合,广泛应用于数据缓存、快速查找等场景。

一、Map核心接口

java.util.Map接口定义了键值对的基本操作:


二、常见Map实现类对比

实现类数据结构线程安全有序性允许Null键/值时间复杂度(平均)
HashMap数组+链表/红黑树无序允许O(1)
LinkedHashMap链表+哈希表插入顺序或访问顺序允许O(1)
TreeMap红黑树键的自然排序或自定义不允许Null键O(log n)
ConcurrentHashMap分段锁+哈希表无序不允许Null键/值O(1)
Hashtable数组+链表是(全表锁)无序不允许O(1)

三、HashMap深度解析

1. 内部结构
  • 数组(桶):初始容量(默认16),负载因子(默认0.75)。

  • 链表与红黑树:当链表长度≥8时,链表转为红黑树;当红黑树节点≤6时,退化为链表。

2. 哈希冲突解决
  • 链地址法:相同哈希值的键值对以链表形式存储。

  • 再哈希法:通过hash()方法二次计算哈希值(扰动函数减少碰撞)。

3. 扩容机制

  • 触发条件:当元素数量 > 容量 × 负载因子时扩容。

  • 扩容过程:新建2倍容量数组,重新计算键的哈希并分配到新桶(耗时操作)。

4. 线程安全性

   • 非线程安全:多线程并发修改可能导致死循环(JDK1.7链表头插法)或数据丢失。

   • 替代方案:使用ConcurrentHashMapCollections.synchronizedMap()

四、ConcurrentHashMap(JDK8+)

1. 分段锁优化
  • 数据结构:数组 + 链表/红黑树(同HashMap),但使用CAS + synchronized实现线程安全。

  • 锁粒度:锁单个桶(链表头节点),减少锁竞争。

2. 关键方法
  • putVal()

3. 性能优势
  • 高并发读:无锁访问(volatile变量保证可见性)。

  • 写操作:仅锁定当前桶,其他桶可并行操作。


五、TreeMap与红黑树

1. 有序性实现
  • 自然排序:键需实现Comparable接口。

  • 自定义排序:通过Comparator指定排序规则。

2. 红黑树特性
  • 自平衡二叉查找树:确保查找、插入、删除的时间复杂度为O(log n)。

  • 五大规则

    1. 节点是红色或黑色。

    2. 根节点是黑色。

    3. 叶子节点(NIL)是黑色。

    4. 红色节点的子节点必须是黑色。

    5. 任意节点到叶子节点的路径包含相同数量的黑色节点。


六、LinkedHashMap与LRU缓存

1. 维护插入顺序
  • 双向链表:在哈希表基础上维护条目插入顺序。

  • 访问顺序模式

2. LRU缓存实现
  • 最近最少使用:将最近访问的条目移动到链表末尾,淘汰链表头部条目。


七、Map的使用场景与选择建议

场景推荐实现理由
高频查询,无并发HashMap查询速度快,内存占用小
高并发读写ConcurrentHashMap分段锁保证线程安全,性能高
需要排序TreeMap自然或自定义顺序遍历
LRU缓存LinkedHashMap内置淘汰策略,维护访问顺序
遗留系统兼容Hashtable线程安全但性能低,通常不推荐新项目使用

八、Map的性能优化

  1. 合理初始化容量:减少扩容次数。

  1. 避免哈希冲突:重写hashCode()equals()方法,确保键的散列均匀。

  2. 选择合适实现:根据线程安全和排序需求选择Map类型。


九、常见问题

Q1:HashMap与Hashtable的区别?
  • 线程安全:Hashtable全表锁,性能低;HashMap非线程安全。

  • Null支持:Hashtable不允许Null键/值,HashMap允许。

Q2:ConcurrentHashMap如何保证线程安全?
  • JDK7:分段锁(Segment)。

  • JDK8+:CAS + synchronized锁单个桶。

Q3:如何实现线程安全的LRU缓存?
  • 使用LinkedHashMap并重写removeEldestEntry(),或结合ConcurrentHashMap和双向链表。


通过深入理解Map的实现原理及适用场景,可以在开发中灵活选择最优数据结构,提升系统性能和代码可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值