treeset的核心魅力在于其能自动对元素进行排序并去重,这得益于底层基于红黑树的treemap实现。1. 自然排序:当元素实现了comparable接口时,treeset使用compareto()方法确定顺序,如string、integer等类型可直接排序;2. 自定义排序:通过向treeset构造器传入comparator实例,可定义特定比较规则,适用于无自然顺序或需多种排序方式的场景。需注意:treeset以compareto()或compare()返回0作为“相等”判断标准,而非equals()方法,因此建议比较逻辑与equals()保持一致,避免去重异常;同时,treeset不支持null元素(除非comparator显式处理),且其add、remove、contains操作时间复杂度为o(log n),空间开销高于hashset。适用于需有序去重、范围查询等场景,但非线程安全,多线程环境下需外部同步或选用concurrentskiplistset。

Java集合框架中的
TreeSet
TreeSet
TreeSet
TreeMap
TreeSet
HashSet
具体来说,
TreeSet
立即学习“Java免费学习笔记(深入)”;
自然排序(Natural Ordering): 如果添加到
TreeSet
java.lang.Comparable
TreeSet
compareTo()
Integer
String
java.lang
Comparable
TreeSet
import java.util.TreeSet;
public class NaturalOrderingDemo {
public static void main(String[] args) {
TreeSet<String> names = new TreeSet<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");
names.add("Alice"); // 重复元素不会被添加
System.out.println("自然排序的TreeSet: " + names); // 输出: [Alice, Bob, Charlie]
}
}自定义排序(Custom Ordering): 当元素类型没有实现
Comparable
TreeSet
java.util.Comparator
Comparator
import java.util.Comparator;
import java.util.TreeSet;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
public class CustomOrderingDemo {
public static void main(String[] args) {
// 根据年龄降序排序的Comparator
Comparator<Person> ageDescComparator = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
// 年龄相同则按名字排序,确保唯一性判断的合理性
int ageComparison = Integer.compare(p2.age, p1.age);
if (ageComparison == 0) {
return p1.name.compareTo(p2.name);
}
return ageComparison;
}
};
TreeSet<Person> peopleByAgeDesc = new TreeSet<>(ageDescComparator);
peopleByAgeDesc.add(new Person("Alice", 30));
peopleByAgeDesc.add(new Person("Bob", 25));
peopleByAgeDesc.add(new Person("Charlie", 30)); // 年龄相同,按名字排序
System.out.println("按年龄降序排序的TreeSet: " + peopleByAgeDesc);
// 输出可能为: [Person{name='Alice', age=30}, Person{name='Charlie', age=30}, Person{name='Bob', age=25}]
}
}无论是哪种方式,
TreeSet
compareTo()
compare()
TreeSet
深入了解
TreeSet
TreeSet
当一个元素被
add
TreeSet
TreeSet
TreeMap
这里有一个需要特别注意的“坑”:
TreeSet
TreeMap
compareTo()
compare()
equals()
Comparable
Comparator
a.compareTo(b) == 0
a.equals(b)
false
TreeSet
a
b
TreeSet
compareTo()
compare()
equals()
compareTo()
equals()
true
TreeSet
常见应用场景:
TreeSet
TreeSet
subSet(fromElement, toElement)
headSet(toElement)
tailSet(fromElement)
PriorityQueue
TreeSet
TreeSet
性能考量:
TreeSet
add
remove
contains
HashSet
TreeSet
TreeSet
HashSet
HashSet
TreeSet
TreeSet
Collections.synchronizedSortedSet(new TreeSet<>())
java.util.concurrent
ConcurrentSkipListSet
在
TreeSet
Comparable
Comparator
Comparable
Comparable
compareTo(T o)
String
Integer
Comparable
Comparable
// 示例:Person类实现Comparable,按年龄自然排序
class Person implements Comparable<Person> {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
// 默认按年龄升序排序
int ageComparison = Integer.compare(this.age, other.age);
if (ageComparison == 0) {
// 年龄相同则按名字排序,确保唯一性判断的合理性
return this.name.compareTo(other.name);
}
return ageComparison;
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}Comparator
Comparator
compare(T o1, T o2)
Person
Comparable
Comparable
Comparator
Comparator
TreeSet
最佳实践与注意事项:
Comparable
Comparator
equals()
a.compareTo(b) == 0
comparator.compare(a, b) == 0
a.equals(b)
true
TreeSet
TreeSet
TreeSet
null
Comparator
null
null
NullPointerException
Comparator
thenComparing()
在实际项目中,我个人倾向于在类有明确且唯一的自然排序时实现
Comparable
Comparator
TreeSet
以上就是Java集合框架怎样利用TreeSet实现元素排序_Java集合框架有序集合的应用技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号