1. 数据结构与算法中的核心工具类解析
在算法刷题和实际工程开发中,Java提供的工具类是我们解决问题的利器。Set、HashMap和String这三个类几乎出现在90%以上的LeetCode题目中,但很多开发者仅仅停留在基础用法层面,没有深入理解它们的底层实现机制和使用技巧。今天我们就来彻底剖析这三个核心工具类,从源码实现到高频应用场景,再到LeetCode中的实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Set类深度解析与应用
2.1 Set接口的核心特性
Set是Java Collections Framework中表示数学集合概念的接口,它的核心特性是元素唯一性和无序性(LinkedHashSet除外)。在LeetCode中,HashSet和TreeSet是最常用的实现类:
java复制// 典型初始化方式
Set<Integer> hashSet = new HashSet<>();
Set<String> treeSet = new TreeSet<>();
HashSet基于HashMap实现,插入、删除和查找操作的时间复杂度都是O(1)。但要注意,这个O(1)是在理想哈希分布下的情况,实际性能受负载因子和哈希冲突影响。
2.2 HashSet的底层实现机制
HashSet的内部实际上是用HashMap来存储元素,所有元素都作为HashMap的key存在,而value则统一使用一个静态的Object对象:
java复制// HashSet源码节选
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
这种实现方式带来了几个重要特性:
- 元素必须正确实现hashCode()和equals()方法
- 允许null元素(但只能有一个)
- 迭代顺序不保证(与添加顺序无关)
2.3 TreeSet的有序特性
TreeSet基于TreeMap实现,使用红黑树数据结构,因此它保持元素处于排序状态:
java复制TreeSet<Integer> set = new TreeSet<>();
set.add(3); set.add(1); set.add(2);
System.out.println(set); // 输出[1, 2, 3]
TreeSet的add/remove/contains操作时间复杂度为O(log n),适用于需要有序遍历的场景。在LeetCode中,TreeSet常用于解决需要维护动态有序集合的问题,如"数据流的中位数"等。
2.4 LeetCode实战应用场景
场景一:快速去重
java复制// 题目:给定数组,返回不含重复元素的列表
public List<Integer> removeDuplicates(int[] nums) {
Set<Integer> set = new Has
