TreeSet的底层原理和排序机制?
请解释Java中TreeSet的底层数据结构、排序机制以及如何保证元素唯一性。说明自然排序(Comparable)和定制排序(Comparator)两种方式,以及与HashSet的性能对比。
回答
古法程序员
TreeSet:基于TreeMap(红黑树)实现。
- 实际存储:TreeMap的key,value为PRESENT常量对象
- 有序性:元素按自然顺序(Comparable)或Comparator排序
- 唯一性:通过compareTo/compare方法判定,返回0视为重复元素(不插入)
排序方式:
- 自然排序:元素实现Comparable接口
TreeSet<String> set = new TreeSet<>(); // 字符串自然排序(字典序)
- 定制排序:传入Comparator
TreeSet<User> set = new TreeSet<>((a,b) -> a.getAge() - b.getAge());
注意:TreeSet通过compareTo/compare决定元素是否相等,而不是equals()。所以必须保证compareTo与equals一致(除非你清楚后果)。
性能对比:
- HashSet:O(1)(哈希表),无序
- TreeSet:O(log n)(红黑树),有序
适用场景:需要有序集合、范围查询(subSet、headSet、tailSet)、或者需要ceiling/floor/lower/higher等导航方法时使用TreeSet。