treeset默认按自然顺序排序,要求元素类实现comparable接口并重写compareto()方法;string、integer等已实现该接口,自定义类需手动实现;不支持null和类型混存,也可通过comparator自定义排序规则。

TreeSet 默认就按元素的自然顺序排序,前提是元素所属的类实现了 Comparable 接口,并正确重写了 compareTo() 方法。
自然排序的前提:实现 Comparable 接口
Java 中的 String、Integer、Double 等包装类和常用类已经实现了 Comparable,所以可以直接放入 TreeSet 并自动排序:
- Integer 按数值大小升序(1, 2, 5, 10)
- String 按字典序升序("apple", "banana", "cherry")
- LocalDate 按时间先后升序
自定义类怎么支持自然排序?
如果你的类(比如 Person)想用自然排序,就得让它实现 Comparable
- 返回负数 → 当前对象小于参数对象(排前面)
- 返回 0 → 两者相等(TreeSet 会去重)
- 返回正数 → 当前对象大于参数对象(排后面)
例如按年龄升序:
public class Person implements Comparable<person> {
private String name;
private int age;
// 构造、getter 省略
@Override
public int compareTo(Person p) {
return Integer.compare(this.age, p.age); // 升序
}
}</person>
注意:null 和类型不匹配会抛异常
TreeSet 不允许存 null(调用 add(null) 会抛 NullPointerException);也不能混存不同类型的对象(比如同时 add(1, "abc")),因为 compareTo 无法比较,运行时抛 ClassCastException。
如果不想用自然排序,可以用 Comparator
构造 TreeSet 时传入自定义 Comparator,就能按其他规则排序(如降序、按姓名长度等),这时就不依赖 Comparable 了:
TreeSet<integer> set = new TreeSet(Comparator.reverseOrder()); // 降序</integer>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











