java HashSet TreeSet 基本使用和区别

发布时间:2025-04-29      访问量:41
下面详细介绍 Java 中 `HashSet` 和 `TreeSet` 的基本使用与区别。

基本使用

`HashSet`
`HashSet` 基于哈希表实现,它不保证元素的顺序,允许存储一个 `null` 元素。其插入、删除和查找操作的平均时间复杂度为 $O(1)$。

以下是 `HashSet` 的使用示例:
import java.util.HashSet; import java.util.Set; public class HashSetUsage { public static void main(String[] args) { // 创建 HashSet Set<String> hashSet = new HashSet<>(); // 添加元素 hashSet.add("grape"); hashSet.add("lemon"); hashSet.add("peach"); // 尝试添加重复元素 hashSet.add("lemon"); // 检查元素是否存在 boolean hasGrape = hashSet.contains("grape"); System.out.println("是否包含 grape: " + hasGrape); // 删除元素 hashSet.remove("peach"); // 遍历元素 for (String fruit : hashSet) { System.out.println(fruit); } } }

`TreeSet`
`TreeSet` 基于红黑树(一种自平衡的二叉搜索树)实现,它会对元素进行排序,默认按照元素的自然顺序排序(元素必须实现 `Comparable` 接口),也可通过传入 `Comparator` 自定义排序规则,不允许存储 `null` 元素。插入、删除和查找操作的时间复杂度为 $O(log n)$。

以下是 `TreeSet` 的使用示例:
import java.util.TreeSet; import java.util.Set; public class TreeSetUsage { public static void main(String[] args) { // 创建 TreeSet Set<String> treeSet = new TreeSet<>(); // 添加元素 treeSet.add("kiwi"); treeSet.add("mango"); treeSet.add("date"); // 尝试添加重复元素 treeSet.add("mango"); // 检查元素是否存在 boolean hasKiwi = treeSet.contains("kiwi"); System.out.println("是否包含 kiwi: " + hasKiwi); // 删除元素 treeSet.remove("date"); // 遍历元素 for (String fruit : treeSet) { System.out.println(fruit); } } }

区别

排序方面
- **`HashSet`**:不保证元素的存储顺序,每次遍历元素时顺序可能不同。
- **`TreeSet`**:会对元素进行排序,要么按照自然顺序,要么按照自定义的 `Comparator` 规则排序。

性能方面
- **`HashSet`**:插入、删除和查找操作平均时间复杂度为 $O(1)$,性能在多数情况下更优。
- **`TreeSet`**:插入、删除和查找操作时间复杂度为 $O(log n)$,性能相对较低。

元素要求方面
- **`HashSet`**:允许存储一个 `null` 元素。
- **`TreeSet`**:不允许存储 `null` 元素,因为需要对元素进行比较排序。

底层实现方面
- **`HashSet`**:基于 `HashMap` 实现,元素存储在 `HashMap` 的键中。
- **`TreeSet`**:基于 `TreeMap` 实现,元素存储在 `TreeMap` 的键中。
堆内存
多线程
strdup
初始化器
冒泡排序
增删改查
BufferedReader
输入输出
面向对象
生命周期
闭包的概念
原型链
Flask
mysql-connector-python
单例模式
浅拷贝
隔离级别
索引
InnoDB
左连接
聚合函数
PuTTY
TRUNCATE
str_starts_with_many
DateTime
array_combine
闭包的概念