介绍
TreeSet:基于红黑树实现的有序集合,按元素的自然顺序或自定义顺序排序。
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Item 1");
treeSet.add("Item 2");
TreeSet 的底层实现是基于 TreeMap 的,它实际上是通过 TreeMap 来实现的,只不过在 TreeSet 中只使用了 TreeMap 的键,而值则统一使用一个私有静态常量对象。
下面是 TreeSet 底层实现的简要分析:
- TreeMap:TreeSet 内部维护了一个 TreeMap 对象,作为存储元素的载体。
- 存储元素:当向 TreeSet 中添加元素时,实际上是将该元素作为 TreeMap 的键存储,而值则存储为一个私有静态常量对象,比如
private static final Object PRESENT = new Object()
。 - 排序:TreeSet 中的元素会按照它们的自然顺序或者通过提供的 Comparator 进行排序。TreeSet 会利用 TreeMap 的红黑树实现来保持元素的有序性。
- 去重:由于 TreeMap 的键是唯一的,因此 TreeSet 中不会有重复元素。TreeSet 利用 TreeMap 键的唯一性来保证其中不会有重复元素。
- 查找:当调用 TreeSet 的
contains()
方法时,实际上是调用了 TreeMap 的containsKey()
方法来判断元素是否存在。
由于 TreeSet 的底层是基于 TreeMap 实现的,因此具有 TreeMap 的特性,如元素的自动排序、高效的插入和检索操作(平均情况下为 O(log n)),以及去重功能。不过需要注意的是,TreeSet 并不保证元素的顺序,它是根据元素的比较规则来进行排序的。
常用方法:
-
add(E e):向 TreeSet 中添加元素。
TreeSet<String> treeSet = new TreeSet<>(); treeSet.add("Apple"); treeSet.add("Banana");
-
remove(Object o):移除 TreeSet 中的指定元素。
treeSet.remove("Apple");
-
contains(Object o):判断 TreeSet 是否包含指定元素。
boolean containsBanana = treeSet.contains("Banana");
-
size():返回 TreeSet 的大小(元素数量)。
int size = treeSet.size();
-
isEmpty():判断 TreeSet 是否为空。
boolean isEmpty = treeSet.isEmpty();
-
clear():清空 TreeSet 中的所有元素。
treeSet.clear();
-
first():返回 TreeSet 的第一个(最小)元素。
String first = treeSet.first();
-
last():返回 TreeSet 的最后一个(最大)元素。
String last = treeSet.last();
-
lower(E e):返回小于指定元素的最大元素。
String lower = treeSet.lower("Banana"); // 返回 "Apple"
-
higher(E e):返回大于指定元素的最小元素。
String higher = treeSet.higher("Apple"); // 返回 "Banana"
-
floor(E e):返回小于等于指定元素的最大元素。
String floor = treeSet.floor("Banana"); // 返回 "Banana"
-
ceiling(E e):返回大于等于指定元素的最小元素。
String ceiling = treeSet.ceiling("Banana"); // 返回 "Banana"
-
pollFirst():移除并返回 TreeSet 的第一个(最小)元素。
String first = treeSet.pollFirst();
-
pollLast():移除并返回 TreeSet 的最后一个(最大)元素。
String last = treeSet.pollLast();
-
iterator():返回 TreeSet 的迭代器,用于遍历集合中的元素。
Iterator<String> iterator = treeSet.iterator(); while(iterator.hasNext()) {System.out.println(iterator.next()); }
-
descendingIterator():返回逆序迭代器,从大到小遍历元素。
Iterator<String> descendingIterator = treeSet.descendingIterator(); while(descendingIterator.hasNext()) {System.out.println(descendingIterator.next()); }
这些方法使得 TreeSet 成为一个功能丰富、灵活的有序集合类,可以方便地对元素进行添加、删除、查找和遍历操作。