0%

TreeMap 深度解析(基于 JDK 8)

TreeMap 是 Java 集合框架中基于红黑树实现的 Map 接口实现类,其核心特性是键的有序性—— 通过键的自然排序或定制排序维持键值对的顺序。与 HashMap 相比,TreeMap 不依赖哈希值,而是通过比较键的大小来组织数据,适用于需要有序键值对的场景。本文将从底层结构、排序机制、核心方法及红黑树平衡操作等方面,全面解析 TreeMap 的实现原理。

TreeMap 核心特性与继承关系

核心特性

  • 有序性:键值对按键的顺序(自然排序或定制排序)存储,遍历顺序为键的升序(或定制排序顺序)。
  • 无哈希冲突:基于红黑树实现,不依赖哈希值,因此不存在哈希冲突问题。
  • 键不可为 null:自然排序时,键需实现 Comparable 接口,compareTo 方法无法处理 null;定制排序时,若 Comparator 不支持 null,则键也不能为 null(否则抛出 NullPointerException)。
  • 非线程安全:多线程并发修改需手动同步(如使用 Collections.synchronizedSortedMap)。
  • 导航方法:实现 NavigableMap 接口,提供丰富的导航方法(如 ceilingKeyfloorKeysubMap 等),方便范围查询。

继承关系

TreeMap

1
2
public class TreeMap<K,V> extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
  • 继承 AbstractMap:复用 Map 接口的基础实现(如 entrySetsize 等)。
  • 实现 NavigableMap:扩展 SortedMap 接口,支持导航操作(如获取大于 / 小于某键的最值)。
  • 实现 Cloneable:支持浅拷贝(复制红黑树结构,键值对对象本身不复制)。
  • 实现 Serializable:支持序列化,通过自定义 writeObjectreadObject 保存 / 恢复红黑树结构。

底层结构:红黑树

TreeMap 的底层是红黑树—— 一种自平衡二叉搜索树(BST),通过维护节点颜色和旋转操作,确保树的高度始终为 O(log n),从而保证增删改查的时间复杂度为 O(log n)

红黑树的基本性质

红黑树通过以下性质维持平衡:

阅读全文 »

HashMap 深度解析(基于 JDK 8)

HashMap 是 Java 集合框架中使用最广泛的 Map 实现类,基于哈希表(数组 + 链表 + 红黑树)实现,支持高效的键值对存储与查询。其设计兼顾了时间和空间效率,是单线程环境下键值对存储的首选。本文将从底层结构、核心源码、工作机制及并发问题等方面,全面剖析 HashMap 的实现原理。

HashMap 核心特性与继承关系

核心特性

  • 键唯一性:键(key)不可重复,重复插入会覆盖原值。
  • 允许 null:键和值均可为 null(键最多 1 个 null,值可多个)。
  • 无序性:存储顺序与插入顺序无关(由键的哈希值决定)。
  • 动态扩容:容量不足时自动扩容,默认扩容为原容量的 2 倍。
  • 非线程安全:多线程并发修改可能导致数据不一致(如死循环、数据覆盖)。

继承关系

HashMap

1
2
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
  • 继承 AbstractMap:复用 Map 接口的基础实现(如 entrySetkeySet 等)。
  • 实现 Map:遵循键值对集合的规范。
  • 实现 Cloneable:支持浅拷贝(仅复制结构,不复制元素对象)。
  • 实现 Serializable:支持序列化,通过 writeObjectreadObject 自定义序列化逻辑。

底层数据结构:数组 + 链表 + 红黑树

HashMap 的底层结构是哈希表,JDK 8 中采用 “数组 + 链表 + 红黑树” 的组合结构,平衡了哈希冲突处理与查询效率:

阅读全文 »

Java Map 接口及主要实现类详解

Map 是 Java 集合框架中用于存储键值对(key-value)的接口,与 Collection 接口并列,是日常开发中最常用的数据结构之一。Map 中的键(key)具有唯一性,值(value)可重复,键与值一一对应。本文将详细解析 Map 接口的主要实现类,包括 Hashtable、HashMap、TreeMap、LinkedHashMap 和 ConcurrentHashMap,分析它们的底层结构、核心特性及适用场景。

Map 接口概述

Map 接口定义了键值对集合的基本操作,如添加(put)、删除(remove)、查询(get)、遍历等。其核心方法包括:

  • V put(K key, V value):添加键值对,若键已存在则覆盖值并返回旧值。
  • V get(Object key):根据键获取值,若键不存在则返回 null
  • boolean containsKey(Object key):判断是否包含指定键。
  • Set<K> keySet():返回所有键的集合(无序,除非实现类保证有序)。
  • Collection<V> values():返回所有值的集合。
  • Set<Map.Entry<K,V>> entrySet():返回键值对实体的集合,用于遍历。

主要实现类解析

Hashtable(线程安全的早期实现)

Hashtable 是 JDK 1.0 引入的最早的 Map 实现类,基于哈希表(数组 + 链表)实现,是线程安全的,但性能较低。

核心特性
  • 线程安全:所有方法均用 synchronized 修饰,保证多线程安全,但并发效率低。

  • 不允许 null:键(key)和值(value)均不能为 null,否则抛出 NullPointerException

  • 继承关系:继承自Dictionary类(已过时),实现Map接口。

    1
    public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
底层结构
  • 用Entry数组存储键值对,Entry是单向链表节点,包含hash、key、value、next(下一个节点)。

阅读全文 »

Spring 事件监听机制:从原理到实战

Spring 事件监听机制是基于观察者模式的一种实现,用于组件间的解耦通信。通过事件发布者(Publisher)、事件(Event)和事件监听器(Listener)三者的配合,实现了 “发布 - 订阅” 模式,让组件无需直接依赖即可完成交互。本文将详细解析 Spring 事件监听的核心原理、内置事件及自定义事件的实现方式。

Spring 事件监听的核心组件

Spring 事件监听机制包含三个核心角色,它们协同工作完成事件的发布与处理:

组件 作用 核心接口 / 类
事件(Event) 传递的消息载体,封装了需要传递的数据 ApplicationEvent(所有事件的父类)
事件发布者(Publisher) 负责发布事件到容器中 ApplicationEventPublisher(发布接口)
事件监听器(Listener) 监听指定类型的事件,当事件发布时执行回调逻辑 ApplicationListener<E>(监听接口)

三者关系如下:

  1. 事件发布者通过 publishEvent() 方法发布事件;
  2. Spring 容器将事件传递给所有订阅该事件的监听器;
  3. 监听器通过 onApplicationEvent() 方法处理事件。

Spring 内置事件

Spring 框架自带了 5 种标准事件,用于监听容器生命周期和 Web 请求等场景,这些事件均继承自 ApplicationEvent

阅读全文 »

HashSet 源码深度解析(基于 JDK 8)

HashSet 是 Java 集合框架中最常用的 Set 实现类,基于 HashMap 实现,具有无序性不可重复性高效性的特点。本文将从继承关系、核心实现、方法原理及使用场景等方面,全面解析 HashSet 的工作机制。

HashSet 核心特性与继承关系

核心特性

  • 无序性:元素存储顺序与插入顺序无关(由哈希值决定存储位置)。
  • 不可重复性:不允许存储重复元素(通过 equals()hashCode() 判断重复)。
  • 高效性:添加、删除、查找元素的平均时间复杂度为 O(1)
  • 支持 null 元素:允许存储一个 null(因不可重复)。
  • 非线程安全:多线程并发修改可能导致数据不一致(需手动同步或使用 ConcurrentHashMap 构建的 Set)。

继承关系

HashSet

1
2
3
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
  • 继承 AbstractSet:复用了 Set 接口的部分默认实现(如 size()isEmpty() 等)。
  • 实现 Set:遵循 Set 接口规范,确保元素不可重复。
  • 实现 Cloneable:支持克隆(浅拷贝,底层 HashMap 被复制,但元素对象本身不复制)。
  • 实现 Serializable:支持序列化,通过自定义序列化方法优化性能。

核心结构:基于 HashMap 的封装

HashSet 本身没有独立的底层结构,而是通过封装 HashMap 实现功能

阅读全文 »