Map是键值对(Key-Value) 存储的集合,核心特点是Key唯一、Value可重复,作用类似字典,能通过Key快速定位Value。

一、核心顶层接口:Map

仅定义通用方法,无具体实现,常用核心方法如下:

• V put(K key, V value):添加或修改键值对(Key已存在时,会覆盖原有Value)。

• V get(Object key):通过Key获取对应Value(Key不存在时返回null)。

• boolean containsKey(Object key):判断集合中是否包含指定Key。

• Set<K> keySet():获取所有Key的Set集合(因Key唯一,符合Set的特性)。

• Collection<V> values():获取所有Value的Collection集合(因Value可重复,用Collection存储)。

二、三大常用实现类

1. HashMap(日常首选)

• 底层结构:JDK 1.8前是“数组+链表”,1.8后优化为“数组+链表/红黑树”。

• 线程安全:非线程安全,不能在多线程场景下直接使用(需额外加锁或用ConcurrentHashMap)。

• null允许:Key最多只能有1个null,Value可以有多个null。

• 核心特点:查询、插入效率极高(平均时间复杂度O(1)),是开发中最常用的Map实现。

2. TreeMap(需排序场景用)

• 底层结构:基于红黑树实现(一种自平衡的二叉查找树)。

• 线程安全:非线程安全。

• null允许:Key和Value都不允许为null,否则会抛出空指针异常。

• 核心特点:Key会自动排序,排序规则需通过实现Comparable接口或传入Comparator对象指定。

3. Hashtable(古老的线程安全实现)

• 底层结构:基于“数组+链表”实现(无红黑树优化)。

• 线程安全:线程安全,但通过对方法加synchronized锁实现,锁粒度大,效率低。

• null允许:Key和Value都不允许为null。

• 核心特点:属于早期API,目前已被ConcurrentHashMap替代(后者效率更高,支持分段锁)。

三、高频考点:HashMap关键特性

1. 红黑树转换条件:当链表长度超过8,且数组容量≥64时,链表会转为红黑树;当红黑树节点数少于6时,会转回链表(平衡查询和插入效率)。

2. 扩容机制:初始容量为16,负载因子为0.75(当元素个数达到16×0.75=12时触发扩容),每次扩容后容量变为原来的2倍(保证哈希计算时用位运算,提升效率)。

3. 哈希冲突解决:通过“链地址法”解决,即相同哈希值的Key会存储在同一数组位置的链表

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐