TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储HashSet的元素。由于map中key都是不可重复的,因此,TreeSet天然具有“不可重复”的特性。
我们打开TreeSet的源码,发现里面有一行核心代码:
TreeMap是NavigableMap(基于红黑树)的实现类,而TreeSet底层使用NavigableMap来保存元素,所以说TreeSet内部维持了一个简化版的TreeMap,通过key来存储元素。
- TreeSet****的使用
TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列,TreeSet中的元素支持2种排序方式:
- 自然排序:通过实现Comparerable接口 ,并且重写compareTo方法。
TreeSet类的add()方法中会把存入的对象提升为Comparable类型, 调用对象的compareTo() 方 法和集合中的对象比较(当前存入的是谁,谁就会调用compareTo方法),根据compareTo() 方法返回的结果进行存储。
- 比较器排序:通过实现Comparetor接口,并且重写compare方法。
创建TreeSet的时候可以制定一个Comparator,如果传入了Comparator的子类对象,那么TreeSet 就会按照比较器中的顺序排序。add()方法内部会自动调用Comparator接口中compare()方法排 序。调用的对象(就是当前存入的对象)是compare方法的第一个参数,集合中的对象(已经 添加进去的对象)是compare方法的第二个参数。
- 自然排序
给TreeSet 中存储 JavaAPI 中提供的类型元素时,不需要实现Comparerable接口,因为在 JavaAPI 的每个类中已经重写完毕,如 String 类、Integer 类等,默认排序为升序。
【示例】HashSet存储 String
// 实例化一个TreeSet对象
TreeSet<String> set = new TreeSet<String>();
// 添加元素
set.add("bbb");
set.add("ccc");
set.add("aaa");
set.add("eee");
set.add("ddd");
set.add("eee"); // 只能输出一个“eee”
// 遍历元素
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next()