Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
在 Java 中搜索型数据结构主要包括二叉搜索树BST、Map/Set 体系以及哈希表Hash Table。它们各自适用于不同的场景具有不同的性能特征和实现方式。以下是全面解析一、二叉搜索树Binary Search Tree, BST1. 定义与性质若左子树非空则左子树上所有节点的值小于根节点若右子树非空则右子树上所有节点的值大于根节点左右子树本身也是二叉搜索树。中序遍历 BST 得到的是升序序列。2. 基本操作查找从根开始比较目标值与当前节点决定向左或向右递归。插入找到合适位置叶子节点插入新节点。删除较复杂删除叶子节点直接移除删除只有一个子节点的节点用子节点替代删除有两个子节点的节点找中序后继右子树最小值或前驱左子树最大值替换。3. 性能分析最好情况平衡树高度为 $O(\log n)$操作时间复杂度为 $O(\log n)$最坏情况退化为链表高度为 $O(n)$操作退化为 $O(n)$。Java 中TreeMap和TreeSet的底层是红黑树一种自平衡 BST保证最坏情况仍为 $O(\log n)$。二、Map 与 Set 体系Java 集合框架中Map和Set是专门用于高效查找的接口。1. Map 接口存储键值对Key-Value键不可重复。常见实现HashMap基于哈希表无序允许null键/值TreeMap基于红黑树按键排序不允许null键。2. Set 接口存储不重复元素可视为Map的键集合。常见实现HashSet基于HashMap无序TreeSet基于TreeMap元素自然排序或自定义排序。3. 使用场景数据结构底层实现是否有序是否允许 null时间复杂度平均HashMap哈希表否是$O(1)$TreeMap红黑树是否$O(\log n)$HashSet哈希表否是$O(1)$TreeSet红黑树是否$O(\log n)$三、哈希表Hash Table1. 核心思想通过哈希函数将键映射到数组索引实现O(1) 平均查找。2. 哈希冲突定义不同键映射到同一索引。解决方法开放地址法闭散列线性探测、二次探测等链地址法开散列/哈希桶每个桶是一个链表Java 8 优化为红黑树当链表长度 ≥ 8。3. 负载因子Load Factor定义$\text{负载因子} \frac{\text{元素数量}}{\text{桶数量}}$Java 默认负载因子为0.75超过则扩容rehash。4. Java 中的实现HashMap内部使用数组 链表/红黑树初始容量为 16扩容时翻倍。四、总结对比特性二叉搜索树哈希表有序性支持中序遍历不支持除非 LinkedHashMap最坏时间复杂度$O(n)$未平衡$O(n)$极端哈希冲突平均时间复杂度$O(\log n)$平衡$O(1)$空间开销较低仅指针较高需预留空间防冲突适用场景需要有序、范围查询快速查找、插入、删除实际开发中需要快速查找且无需顺序→ 用HashMap/HashSet需要有序或范围操作如floorKey,subSet→ 用TreeMap/TreeSet。希望这份全解能帮助你深入理解 Java 中的搜索型数据结构