黑马程序员-集合框架【TreeSet】、【二叉树】、【Comparable接口】、【Comparator接口】

来源:互联网 发布:如何去日本工作知乎 编辑:程序博客网 时间:2024/05/21 06:52

   ----------------------ASP.Net+Unity开发、.Net培训、期待与您交流! --------------------

这章总结知识点主要就是Set的另一个子类TreeSet,讲讲它的底层数据结构,和Comparable接口的关系,最后再介绍下EnumSet

1、TreeSet类

    1、  集合中元素特点:唯一、有序、类型相同

        TreeSet类是set类的子类,因此TtreeSet类中的元素也是不可重复(必须保证元素唯一);并且TreeSet类又是SortSet的实现类,因此TreeSet类中元素的另一个特点,就是有序;因为要保证有序的所以集合中元素需要进行比较来排序,只有同类型的对象才能比较,所以集合中元素的类型必须是相同的

     2、底层实现:想想TreeSet集合又是采用什么样的方式来把对象放入集合,既要保证元素的唯一性,又要进行排序?

    TreeSet集合是采用一种叫做红黑树的数据结构来存储集合元素,当我们把数据对象放入集合之中,首先会把数据对象先拿去和红黑树中的每个节点中的数据对象依次比较,根据它的排序算法找出它在红黑树的存放位置。

     3、Comparable接口:自然排序和定制排序

    1、自然排序

            TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的关系,然后将集合元素按升序排列,这种方式就是自然排序。

   Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了接口的类的对象就可以比较大小,当一个对象调用该方法与另一个对象进行比较时,例如obj1.compareTo(obj2),如果该方法返回一个负数,则表明obj1小于obj2.

   java一些常用的类已经实现了Comparable接口,并提高比较大小的标准

    注:以下类默认实现Comparable接口是以升序对元素进行排序

    1、BigDecimal、BigInteger、以及所有数值型对应的包装类:按照他们对应的数值大小进行比较

    2、Character:按字符的UNICODE值进行比较。

    3、String:按字符串中的UNICODE值进行比较。

    4、Date、Time:后面的时间、日期比前面的时间、日期大

如果试图把一个对象放入集合时,则该对象的类必须实现Comparable,否则将抛出ClassCastException异常

   对于TreeSet集合而言,它判断两个元素是否相等的唯一标准是:两个对象通过compareTo方法比较返回0

  那还需要复写equals方法吗?equals方法也能判断元素是否相同。答案是不需要, 但是如果需要用到equals方法的时候,我们应尽量保持与copareTo的一致性。

  因此,当重写放入集合对象类中的equals方法时,我应保持与compareTo方法的一致性,其规则是:当equals方法返回true时,compareTo方法应返回0。

  注意:当向TreeSet集合中添加对象后,就不要改变它的属性,如果改变将导致它与其他对象的大小顺序发生改变,但TreeSet集合不会为它再次调整顺序,这样就违反了使用TreeSet集合维护元素顺序的初衷了。

    2、定制排序

       现在我们可以通过给TreeSet集合指定比较器的方式来定制集合中元素的排序方式。

  TreeSet类中有这样一个构造方法:publicTreeSet(Comparator<? superE> comparator)  

  其中comparator是接口Comparator实现类的对象实例

  我们通过复写接口Comparator中的compare方法来实现类,而升序、降序就看compare方法的具体实现

个人总结:TreeSet集合有两种方法来维护集合元素顺序,第一种就是通过实现Comparable接口,复写compareTo方法,至于升序降序看实现,第二种方法是在创建集合对象的时候,通过参数指定元素之间比较大小的比较器接Comparator实现类对象,升序降序也是看Comparator接口中方法的具体实现

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击