TreeSet是基于TreeMap作为存储的可排序、可去重的有序集合
继承于AbstractSet,AbstractSet实现了equals和hashcode方法
实现了NavigableSet接口,意味着它支持一系列的导航方法,比如查找与指定目标最匹配项
实现了Cloneable接口,意味着它能被复制
实现了java.io.Serializable接口,意味着它支持序列化

从上面代码可以看出,TreeSet 的前两个构造器的都是新建一个 TreeMap 作为实际存储 Set 元素的容器,而另外 2 个构造器则分别依赖于前两个构造器,由此可见,TreeSet 底层实际使用的存储容器就是 TreeMap
TreeSet排序方式由源码我们可知TreeSet的排序方式有两种:
一是自然排序,使用默认构造函数Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小了。当一个对象调用该方法与另一个对象进行比较,
例如 obj1.compareTo(obj2)
如果该方法返回0,则表明这两个对象相等;
如果该方法返回一个正整数,则表明obj1大于obj2;
Java的一些常用类已经实现了Comparable接口,并提供了比较大小的标准, 下面是实现了Comparable接口的常用类:
BigDecimal、BigInteger以及所有数值型对应包装类:按它们对象的数值大小进行比较
Character :按字符的Unicode值进行比较
Boolean : true对应的包装类实例大于false对应的包装类实例
String : 按字符串中字符的Unicode值进行比较
Date、Time : 后面的时间、日期比前面的日期时间大。
TreeSet的自然排序是根据集合元素的大小默认以升序排列。如果需要完成定制排序,例如以降序排列,则可以使用Comparator接口的帮助。
该接口里包含了一个int compare(T o1, T o2)方法,
该方法用于比较o1、o2的大小:
如果该方法返回正整数,则表明o1大于o2;
如果该方法返回0,则表明o1等于o2;
如果该方法返回负整数,则表明o1小于o2。
事例以自然顺序排序,并且元素不重复public class TreeSetDemo { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(); for (int i = 0; i < 5; i++) { treeSet.add("item" + i); } for (int i = 0; i < 5; i++) { treeSet.add("item" + i); } treeSet.forEach(item -> { System.err.println(item); }); }}输出结果:
item0item1item2item3item4指定一个比较器,倒置集合中的元素
public class TreeSetDemo { public static void main(String[] args) { //指定一个比较器,倒置元素顺序 TreeSet<String> treeSet = new TreeSet<>(Comparator.reverseOrder()); for (int i = 0; i < 5; i++) { treeSet.add("item" + i); } for (int i = 0; i < 5; i++) { treeSet.add("item" + i); } treeSet.forEach(item -> { System.err.println(item); }); }}输出结果:
item4item3item2item1item0TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加
TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,并且元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,在创建TreeSet对象的时候又传入了比较器,此时以比较器的比较规则优先使用。
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |