TreeSet<E>
TreeSet<E> 是 Java 集合框架中的一个重要类,它位于 java.util 包下,实现了 NavigableSet<E> 接口,而 NavigableSet<E> 又继承自 SortedSet<E> 接口。下面从多个方面为你详细介绍 TreeSet<E>。
特性
- 元素唯一:和
Set接口的其他实现类一样,TreeSet不允许存储重复元素。当尝试添加重复元素时,TreeSet会忽略该操作。 - 元素有序:
TreeSet会根据元素的自然顺序或者创建TreeSet时指定的比较器(Comparator)对元素进行排序。若元素实现了Comparable接口,TreeSet会使用元素的自然顺序;若在创建TreeSet时传入了Comparator对象,则使用该比较器定义的顺序。 - 基于红黑树实现:红黑树是一种自平衡的二叉搜索树,这使得
TreeSet在插入、删除和查找操作上的时间复杂度为。
构造方法
TreeSet():创建一个新的空TreeSet,使用元素的自然顺序进行排序。元素必须实现Comparable接口。
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(3);
numbers.add(1);
numbers.add(2);
System.out.println(numbers);
}
}
TreeSet(Comparator<? super E> comparator):创建一个新的空TreeSet,使用指定的比较器进行排序。
import java.util.Comparator;
import java.util.TreeSet;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class TreeSetWithComparator {
public static void main(String[] args) {
Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge);
TreeSet<Person> people = new TreeSet<>(ageComparator);
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 20));
people.add(new Person("Charlie", 30));
System.out.println(people);
}
}
TreeSet(Collection<? extends E> c):创建一个包含指定集合中所有元素的TreeSet,使用元素的自然顺序进行排序。
import java.util.ArrayList;
import java.util.TreeSet;
public class TreeSetFromCollection {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
TreeSet<Integer> numbers = new TreeSet<>(list);
System.out.println(numbers);
}
}
常用方法
add(E e):将指定元素添加到集合中,如果集合中已经存在该元素,则不添加。添加成功返回true,否则返回false。
TreeSet<String> set = new TreeSet<>();
boolean result = set.add("apple");
remove(Object o):从集合中移除指定元素,如果元素存在则移除并返回true,否则返回false。
boolean removed = set.remove("apple");
contains(Object o):判断集合中是否包含指定元素,包含返回true,否则返回false。
boolean contains = set.contains("apple");
first():返回集合中的第一个(最小的)元素。
String firstElement = set.first();
last():返回集合中的最后一个(最大的)元素。
String lastElement = set.last();
size():返回集合中的元素数量。
int size = set.size();
iterator():返回一个用于遍历集合的迭代器,元素按升序排列。
import java.util.Iterator;
import java.util.TreeSet;
TreeSet<String> set = new TreeSet<>();
set.add("apple");
set.add("banana");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
注意事项
- 元素必须可比较:如果使用无参构造函数创建
TreeSet,元素必须实现Comparable接口;如果使用带比较器的构造函数,则无需元素实现Comparable接口。 - 线程不安全:
TreeSet不是线程安全的,如果需要在多线程环境下使用,可以考虑使用Collections.synchronizedSortedSet方法将其包装成线程安全的集合。
import java.util.Collections; import java.util.TreeSet; import java.util.SortedSet; SortedSet<Integer> synchronizedSet = Collections.synchronizedSortedSet(new TreeSet<>());
综上所述,TreeSet 是一个非常实用的集合类,适合需要对元素进行排序和去重的场景。
Java集合框架 文章被收录于专栏
Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。


查看24道真题和解析