TreeSet 和 TreeMap 是 Java 集合框架中两个重要的类,它们的关系非常紧密。简单来说,TreeSet 是基于 TreeMap 实现的。可以将它们的关系理解为:TreeSet 是一个只包含'键'的 TreeMap。
下面详细解释一下:
1. 核心实现关系
在 Java 的源代码中,TreeSet内部维护了一个 TreeMap对象(或 NavigableMap对象)作为其核心存储。当您向 TreeSet中添加一个元素时,这个元素实际上被当作 key放入了内部的 TreeMap中,而 value则是一个固定的、无意义的占位对象。
2. 共同特征
- 有序性:它们都会对元素(对
TreeMap来说是键)进行自然排序(元素实现Comparable接口)或根据构造时传入的Comparator进行排序。遍历时,元素会按照排序后的顺序输出。 - 基于红黑树:它们的底层都使用红黑树数据结构实现。这保证了基本的添加、删除、查找操作的时间复杂度为 O(log n)。
- 非线程安全:它们都不是线程安全的类。
3. 主要区别
| 特性 | TreeSet | TreeMap |
|---|---|---|
| 存储内容 | 只存储单个元素(作为 key) | 存储键值对(key-value pairs) |
| 实现接口 | 实现 Set接口 | 实现 Map接口 |
| 重复元素 | 不允许重复元素 | 不允许重复的 key,但 value可以重复 |
| 数据关联 | 只关心元素本身 | 通过 key来关联和索引 value |
4. 一个简单的类比
您可以把 TreeMap想象成一本字典,每个单词(key)后面都有对应的详细解释(value)。
而 TreeSet就像是这本字典的索引表或单词列表,它只关心有哪些单词(key),并不包含解释。
5. 代码示例说明关系
// TreeSet 的添加操作,内部近似于:
public boolean add(E e) {
return .backingTreeMap.put(e, PRESENT) == ;
}
TreeSet<String> set = <>();
set.add();

