Hashub

醉后不知天在水,满船清梦压星河

0%

treeset集合

TreeSet

概述:

TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态,它与HashSet的区别是,HashSet是根据hash算法来决定元素的存储位置,而TreeSet是采用红黑树的数据结构来存储集合元素。

两种排序:自然排序、定制排序

1. 自然排序

一个接口,一个方法:java提供了一个Comparable接口,在该接口定义了一个compareTo(Object obj)的方法,该方法返回一个整数值,实现该接口的类必须实现该方法。当一个对象调用该方法与另一个对象进行比较的时候,例如:obj1.compareTo(obj2),如果该方法返回0,则表明这两个对象相等,如果返回一个正整数,则表明ojb1大于obj2,若返回一个负整数,则表明obj1小于obj2。

如果要把一个对象元素添加到TreeSet中,该对象的类必须实现Comparable接口,否则程序会抛异常。

提醒:第一个元素无需实现Comparable接口。在TreeSet集合中连续添加对象必须是同类型对象

  • 当把一个对象添加到TreeSet集合中时,TreeSet调用该对象的compareTo(object obj)方法与集合中其他对象比较,然后根据红红黑树结构找到它的存储位置,若对象相等则无法添加到TreeSet集合中。

2.定制排序

上面说了自然排序,自然排序时根据集合元素大小进行升序排序,如果要进行像降序排序则需要用到定制排序。

实现定制排序则需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。(可以使用Lambda表达式来代替Comparator对象)

1
2
3
4
5
6
7
TreeSet ts = new TreeSet((o1,o2) ->{

M m1 = (M)o1;

M m2 = (M)o2;

return m1.age >m2.age ? -1: m1.age<m2.age ? 1:0;});

要点总结:

  1. TreeSet采用红黑树的数据结构来存储集合元素可以确保集合元素处于排序状态(自然排序为升序,要其他排序需要用定制排序)
  2. 一个接口,一个方法,一个实现,一个必须:
  • java提供了一个Comparable接口
  • 在该接口定义了一个compareTo(Object obj)
  • 一个对象元素添加到TreeSet中,该对象的类必须实现Comparable接口
  • 在TreeSet集合中连续添加对象必须是同类型对象

HashSet与TreeSet比较

  1. HashSet性能比TreeSet好,体现在常用的添加、查询等操作,TreeSet需要红黑树算法来维护排序
  2. 对于LinkedHashSet来说,由于存在链表,所以遍历会更快。
  3. 对于普通的插入、删除操作,LinkedHashSet比HashSet要慢,因为由于维护链表的存在会造成额外的开销。

参考:疯狂java讲义、CSDN博客


未完待续

意见和建议欢迎➡右下角联系我