基本使用
`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` 的键中。