Java中的Set集合默认是无序且不可重复的,很多场景下我们需要对Set中的元素进行排序,比如对存储的Integer、String或者自定义对象做升序、降序排列。接下来就介绍几种常用的Set排序实现方式,每种方式都附带可运行的代码示例。

一、使用TreeSet实现排序
TreeSet是Set接口的一个实现类,底层基于红黑树结构,默认会按照元素的自然顺序进行排序,前提是元素实现了Comparable接口。如果元素没有实现该接口,或者我们需要自定义排序规则,也可以传入自定义的比较器。
1.1 自然排序(元素实现Comparable接口)
Integer、String等Java内置类都已经实现了Comparable接口,所以可以直接放入TreeSet实现排序。
import java.util.Set;
import java.util.TreeSet;
public class SetSortDemo {
public static void main(String[] args) {
// 创建TreeSet存储Integer元素,默认升序排序
Set<Integer> numSet = new TreeSet<>();
numSet.add(5);
numSet.add(2);
numSet.add(8);
numSet.add(1);
numSet.add(3);
// 遍历输出,结果为1 2 3 5 8
for (Integer num : numSet) {
System.out.print(num + " ");
}
}
}
1.2 自定义比较器排序
如果需要降序排序,或者元素是自定义类,就可以通过构造TreeSet时传入Comparator比较器来定义排序规则。
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class SetSortDemo2 {
public static void main(String[] args) {
// 传入自定义比较器,实现Integer降序排序
Set<Integer> numSet = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 降序:o2.compareTo(o1)
// 升序:o1.compareTo(o2)
return o2.compareTo(o1);
}
});
numSet.add(5);
numSet.add(2);
numSet.add(8);
numSet.add(1);
numSet.add(3);
// 遍历输出,结果为8 5 3 2 1
for (Integer num : numSet) {
System.out.print(num + " ");
}
}
}
二、借助List中转实现排序
如果已经有一个无序的Set(比如HashSet),我们可以先把Set转换为List,然后用Collections.sort()方法对List排序,最后再把排序后的List转回Set,不过要注意转回Set后如果有自定义排序需求还是需要用TreeSet承接。
import java.util.*;
public class SetSortDemo3 {
public static void main(String[] args) {
// 原始无序的HashSet
Set<Integer> hashSet = new HashSet<>();
hashSet.add(5);
hashSet.add(2);
hashSet.add(8);
hashSet.add(1);
hashSet.add(3);
// 转成List
List<Integer> list = new ArrayList<>(hashSet);
// 对List排序,默认升序
Collections.sort(list);
// 转回TreeSet保持排序结果
Set<Integer> sortedSet = new TreeSet<>(list);
// 遍历输出,结果为1 2 3 5 8
for (Integer num : sortedSet) {
System.out.print(num + " ");
}
}
}
三、使用Stream API实现排序
Java 8之后引入的Stream API也可以很方便地对Set进行排序,通过sorted()方法可以实现自然排序或者自定义排序,最后再收集为Set即可。
import java.util.*;
import java.util.stream.Collectors;
public class SetSortDemo4 {
public static void main(String[] args) {
Set<Integer> hashSet = new HashSet<>();
hashSet.add(5);
hashSet.add(2);
hashSet.add(8);
hashSet.add(1);
hashSet.add(3);
// 使用Stream排序,自然升序,收集为TreeSet
Set<Integer> sortedSet = hashSet.stream()
.sorted()
.collect(Collectors.toCollection(TreeSet::new));
// 遍历输出,结果为1 2 3 5 8
for (Integer num : sortedSet) {
System.out.print(num + " ");
}
System.out.println();
// 自定义降序排序,收集为TreeSet
Set<Integer> descSortedSet = hashSet.stream()
.sorted((o1, o2) -> o2.compareTo(o1))
.collect(Collectors.toCollection(TreeSet::new));
// 遍历输出,结果为8 5 3 2 1
for (Integer num : descSortedSet) {
System.out.print(num + " ");
}
}
}
四、不同排序方式的选择建议
- 如果元素本身有自然顺序,且只需要默认排序,优先选择TreeSet,代码最简洁。
- 如果需要自定义排序规则,且后续还需要频繁操作排序后的集合,用TreeSet传入自定义比较器更高效。
- 如果已经有一个现成的HashSet,临时需要排序用List中转或者Stream API的方式更合适,不需要修改原有集合类型。
- 如果是Java 8及以上环境,Stream API的写法更简洁,可读性也更好,适合函数式编程风格的场景。
JavaSet排序TreeSetStream_APICollections_sort修改时间:2026-06-24 19:36:47