Java教程-Java TreeSet类

Java TreeSet类
Java TreeSet类实现了使用树进行存储的Set接口。它继承了AbstractSet类并实现了NavigableSet接口。TreeSet类的对象按升序存储。
关于Java TreeSet类的重要点有:
- Java TreeSet类仅包含唯一元素,就像HashSet一样。
- Java TreeSet类的访问和检索时间非常快。
- Java TreeSet类不允许空元素。
- Java TreeSet类是非同步的。
- Java TreeSet类维护升序。
- Java TreeSet类仅包含唯一元素,就像HashSet一样。
- Java TreeSet类的访问和检索时间非常快。
- Java TreeSet类不允许空元素。
- Java TreeSet类是非同步的。
- Java TreeSet类维护升序。
- TreeSet只能允许可比较的泛型类型。例如,StringBuffer类实现了Comparable接口。
TreeSet类的内部工作原理
TreeSet使用二叉搜索树实现,它是自平衡的,就像红黑树一样。因此,搜索、删除和添加等操作的时间复杂度为O(log(N))。这是因为二叉搜索树是自平衡的,它确保了树的高度对于所有这些操作都不会超过O(log(N))。因此,它是一种有效的数据结构,用于存储排序的大量数据并对其执行操作。
TreeSet类的同步
如上所述,TreeSet类不是同步的。这意味着如果多个线程同时访问一个TreeSet,并且其中一个访问线程对其进行修改,那么必须手动进行同步。通常情况下,可以通过对封装集合的某个对象进行同步来实现。但是,在找不到这样的对象的情况下,可以使用Collections.synchronizedSet()方法对集合进行包装。建议在创建时使用该方法,以避免对集合进行不同步的访问。以下代码片段显示了相同的情况。
TreeSet treeSet = new TreeSet();
Set syncrSet = Collections.synchronziedSet(treeSet);
TreeSet类的层次结构
如上图所示,Java TreeSet类实现了NavigableSet接口。NavigableSet接口按层次顺序扩展了SortedSet、Set、Collection和Iterable接口。
TreeSet类的声明
让我们看一下java.util.TreeSet类的声明。
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
Java TreeSet类的构造函数
构造函数 | 描述 |
---|---|
TreeSet() | 构造一个空的树集,根据树集的自然顺序按升序排序。 |
TreeSet(Collection<? extends E> c) | 构造一个包含集合c中元素的新树集。 |
TreeSet(Comparator<? super E> comparator) | 构造一个空的树集,根据给定的比较器进行排序。 |
TreeSet(SortedSet<E> s) | 构造一个包含给定SortedSet中元素的TreeSet。 |
Java TreeSet类的方法
方法 | 描述 |
---|---|
boolean add(E e) | 如果该集合中尚未包含指定元素,则将其添加到集合中。 |
boolean addAll(Collection<? extends E> c) | 将指定集合中的所有元素添加到该集合中。 |
E ceiling(E e) | 返回集合中与指定元素相等或大于它的最小元素;如果不存在这样的元素,则返回null。 |
Comparator<? super E> comparator() | 返回用于排序的比较器。 |
Iterator descendingIterator() | 以降序遍历元素的迭代器。 |
NavigableSet descendingSet() | 返回按照相反顺序排列的元素集合。 |
E floor(E e) | 返回集合中与指定元素相等或小于它的最大元素;如果不存在这样的元素,则返回null。 |
SortedSet headSet(E toElement) | 返回小于指定元素的元素组成的子集。 |
NavigableSet headSet(E toElement, boolean inclusive) | 返回小于或等于(如果inclusive为true)指定元素的元素组成的子集。 |
E higher(E e) | 返回集合中与指定元素相等或大于它的最小元素;如果不存在这样的元素,则返回null。 |
Iterator iterator() | 以升序遍历元素的迭代器。 |
E lower(E e) | 返回集合中与指定元素相等或小于它的最大元素;如果不存在这样的元素,则返回null。 |
E pollFirst() | 检索并移除最低(第一个)元素。 |
E pollLast() | 检索并移除最高(最后一个)元素。 |
Spliterator spliterator() | 创建一个后期绑定且快速失败的元素Spliterator。 |
NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | 返回处于给定范围内的元素的子集。 |
SortedSet subSet(E fromElement, E toElement)) | 返回处于给定范围内的元素的子集,包括fromElement但不包括toElement。 |
SortedSet tailSet(E fromElement) | 返回大于或等于指定元素的元素组成的子集。 |
NavigableSet tailSet(E fromElement, boolean inclusive) | 返回大于或等于(如果inclusive为true)指定元素的元素组成的子集。 |
boolean contains(Object o) | 如果该集合包含指定的元素,则返回true。 |
boolean isEmpty() | 如果该集合不包含任何元素,则返回true。 |
boolean remove(Object o) | 如果集合中存在指定的元素,则从集合中移除它。 |
void clear() | 从集合中移除所有元素。 |
Object clone() | 返回此TreeSet实例的浅表副本。 |
E first() | 返回当前排序集中的第一个(最低)元素。 |
E last() | 返回当前排序集中的最后一个(最高)元素。 |
int size() | 返回集合中的元素数量。 |
Java TreeSet示例
Java TreeSet示例1:
让我们看一个简单的Java TreeSet示例。
文件名: TreeSet1.java
import java.util.*;
class TreeSet1 {
public static void main(String args[]) {
// Creating and adding elements
TreeSet<String> al = new TreeSet<String>();
al.add("Ravi");
al.add("Vijay");
al.add("Ravi");
al.add("Ajay");
// Traversing elements
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
}
}
输出:
Ajay
Ravi
Vijay
Java TreeSet示例2:
让我们看一个按降序遍历元素的示例。
文件名: TreeSet2.java
import java.util.*;
class TreeSet2 {
public static void main(String args[]) {
TreeSet<String> set = new TreeSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ajay");
System.out.println("Traversing elements through Iterator in descending order");
Iterator<String> i = set.descendingIterator();
while(i.hasNext()) {
System.out.println(i.next());
}
}
}
输出:
Traversing elements through Iterator in descending order
Vijay
Ravi
Ajay
Java TreeSet示例3:
让我们看一个检索并移除最高值和最低值的示例。
文件名: TreeSet3.java
import java.util.*;
class TreeSet3 {
public static void main(String args[]) {
TreeSet<Integer> set = new TreeSet<Integer>();
set.add(24);
set.add(66);
set.add(12);
set.add(15);
System.out.println("Lowest Value: " + set.pollFirst());
System.out.println("Highest Value: " + set.pollLast());
}
}
输出:
Lowest Value: 12
Highest Value: 66
Java TreeSet示例4:
在这个示例中,我们执行了各种NavigableSet操作。
文件名: TreeSet4.java
import java.util.*;
class TreeSet4 {
public static void main(String args[]) {
TreeSet<String> set = new TreeSet<String>();
set.add("A");
set.add("B");
set.add("C");
set.add("D");
set.add("E");
System.out.println("Initial Set: " + set);
System.out.println("Reverse Set: " + set.descendingSet());
System.out.println("Head Set: " + set.headSet("C", true));
System.out.println("SubSet: " + set.subSet("A", false, "E", true));
System.out.println("TailSet: " + set.tailSet("C", false));
}
}
输出:
Initial Set: [A, B, C, D, E]
Reverse Set: [E, D, C, B, A]
Head Set: [A, B, C]
SubSet: [B, C, D, E]
TailSet: [D, E]