Java集合框架之TreeSet浅析

一、TreeSet综述:

1.1TreeSet简介:

  • TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧:

   public class TreeSet<E> extends AbstractSet<E>
          implements NavigableSet<E>, Cloneable, java.io.Serializable

  • 一种基于TreeMapNavigableSet实现。

    • 因为TreeSet继承了AbstractSet抽象类,所以它是一个set集合,可以被实例化,且具有set的属性和方法。

    • TreeSet中的元素支持2种排序方式:自然排序或者根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

    • TreeSet的性能比HashSet差但是我们在需要排序的时候可以用TreeSet因为他是自然排序也就是升序

    • TreeSet是有序的Set集合,因此支持add、remove、get等方法。

    • TreeSet的本质是一个"有序的,并且没有重复元素"的集合,它是通过TreeMap实现的。TreeSet中含有一个"NavigableMap类型的成员变量"m,而m实际上是"TreeMap的实例"。

1.2TreeSet排序相关:

  • TreeSet支持两只排序方法:自然排序与定制排序。如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则程序会抛出异常java.lang.ClassCastException。原因是TreeSet集合中添加两个Err对象,添加第一个对象时,TreeSet里没有任何元素,所以不会出现任何问题;当添加第二个Err对象时,TreeSet就会调用该对象的compareTo(Object obj)方法与集合中的其他元素进行比较—如果其对应的类没有实现Comparable 接口,则会引发ClassCastException异常

    • 自然排序:

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

      • TreeSet类的add()方法中会把存入的对象提升为Comparable类型

      • 调用对象的compareTo()方法和集合中的对象比较

      • 根据compareTo()方法返回的结果进行存储

    • 定制排序:

      • 如果需要实现定制排序,例如以降序排列,则可通过Comparator接口的帮助。该接口里包含一个int compate(T o1,T o2)方法,该方法用于比较o1和o2的大小:如果该方法返回正整数,则表明o1大于o2;如果该方法返回0,则表明o1等于o2;如果该方法返回负整数,则表明o1小于o2。

      • 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序

      • add()方法内部会自动调用Comparator接口中compare()方法排序

      • 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

    • 两种方式的区别

      • TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)

      • TreeSet如果传入Comparator, 就优先按照Comparator

  • 注意:

    • 在实现compareTo(Object o)方法时,都需要将被比较对象obj强制类型转换成相同类型,因为只有相同类的两个示例才会比较大小。 当试图把一个大对象添加到TreeSet集合时,TreeSet会调用该对象的compareTo(Object o)方法与集合中的其他元素进行比较—这就要求集合中的其他元素与该元素是同一类的示例,否则抛出ClassCaseException异常。总之一句话,如果希望TreeSet能够正常运行,TreeSet只能添加同一类型对象。

    • 与HashSet类似的是,如果TreeSet中包含了可变对象,当可变对象的示例变量被修改时,TreeSet在处理这些对象时将非常复杂,而且容易出错。为了让程序更加健壮,推荐不要修改放入HashSet和TreeSet集合中元素的关键实例变量。

1.3TreeSet实现原理:

  • TreeSet是依靠TrreMap实现的: TreeSet底层则采用一个NavigableMap来保存TreeSet集合的元素。但实际上,由于NavigableMap只是一个接口,因底层依然是使用TreeMap来包含Set集合中的所有元素。

  • TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。

1.4TreeSet在Set接口中的数据结构:

二、TreeSet方法摘要:

构造方法摘要
TreeSet()
          构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c)

          构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator)

          构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet<E> s)

          构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
方法摘要
 boolean add(E e)

          将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
 boolean addAll(Collection<? extends E> c)

          将指定 collection 中的所有元素添加到此 set 中。
 E ceiling(E e)

          返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
 void clear()

          移除此 set 中的所有元素。
 Object clone()

          返回 TreeSet 实例的浅表副本。
 Comparator<? super E> comparator()

          返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null
 boolean contains(Object o)

          如果此 set 包含指定的元素,则返回 true
 Iterator<E> descendingIterator()

          返回在此 set 元素上按降序进行迭代的迭代器。
 NavigableSet<E> descendingSet()

          返回此 set 中所包含元素的逆序视图。
 E first()

          返回此 set 中当前第一个(最低)元素。
 E floor(E e)

          返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null
 SortedSet<E> headSet(E toElement)
          返回此
set 的部分视图,其元素严格小于 toElement
 NavigableSet<E> headSet(E toElement,
boolean inclusive)

          返回此 set 的部分视图,其元素小于(或等于,如果
inclusive 为 true)toElement
 E higher(E e)

          返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null
 boolean isEmpty()

          如果此 set 不包含任何元素,则返回 true
 Iterator<E> iterator()

          返回在此 set 中的元素上按升序进行迭代的迭代器。
 E last()

          返回此 set 中当前最后一个(最高)元素。
 E lower(E e)

          返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
 E pollFirst()

          获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
 E pollLast()

          获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
 boolean remove(Object o)

          将指定的元素从 set 中移除(如果该元素存在于此 set 中)。
 int size()

          返回 set 中的元素数(set 的容量)。
 NavigableSet<E> subSet(E fromElement,
boolean fromInclusive, E toElement, boolean toInclusive)


          返回此 set 的部分视图,其元素范围从 fromElement
toElement
 SortedSet<E> subSet(E fromElement, E toElement)
          返回此
set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
 SortedSet<E> tailSet(E fromElement)
          返回此
set 的部分视图,其元素大于等于 fromElement
 NavigableSet<E> tailSet(E fromElement,
boolean inclusive)

          返回此 set 的部分视图,其元素大于(或等于,如果
inclusive 为 true)fromElement

参考文章:

  https://www.cnblogs.com/Tony-cheen/p/5681831.html

  https://www.cnblogs.com/heyongjun1997/p/5681919.html

  http://blog.csdn.net/jinhuoxingkong/article/details/51191106

  https://www.cnblogs.com/yzssoft/p/7127894.html

  https://www.jianshu.com/p/54d464837a06

Java集合框架之TreeSet浅析的更多相关文章

  1. Java集合框架之TreeMap浅析

    Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:

  2. Java集合框架之HashMap浅析

    Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...

  3. Java集合框架之HashSet浅析

    Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...

  4. Java集合框架之Vector浅析

    Java集合框架之Vector浅析 一.Vector概述: 位于java.util包下的Vector是Java集合框架的重要一员,虽然没有ArrayList那么的常用,但是我们还要对其做相关学习: 1 ...

  5. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

  6. Java集合框架之ArrayList浅析

    Java集合框架之ArrayList浅析 一.ArrayList综述: 位于java.util包下的ArrayList是java集合框架的重要成员,它就是传说中的动态数组,用MSDN中的说法,就是Ar ...

  7. Java集合框架之TreeSet

    简述 TreeSet是基于TreeMap作为存储的可排序.可去重的有序集合 继承于AbstractSet,AbstractSet实现了equals和hashcode方法 实现了NavigableSet ...

  8. Java集合框架系列大纲

    ###Java集合框架之简述 Java集合框架之Collection Java集合框架之Iterator Java集合框架之HashSet Java集合框架之TreeSet Java集合框架之Link ...

  9. Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...

随机推荐

  1. 机器学习之K均值聚类

      聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想   K均值聚类的基本思想是,通过迭代的方法寻找K个 ...

  2. mysql协议分析2---认证包

    主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主 ...

  3. Spark 源码分析系列

    如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...

  4. JS原生隐士标签扩展

    最近项目开发中,开发了不少的接口,有一个接口是这样子的.先从A公司拿到数据后,存放到我们公司数据库里,然后需要将数据展示给客户,下面这个界面,后台要实时刷新,后台写了个定时器,2S刷一次从后台拼接好H ...

  5. 考试安排查询脚本(CUP)

    去年热情高涨的时候心血来潮做了个简易的查询脚本,限于当时技术水平(菜),实现得不是很好,这几天终于想起来填坑了.环境依赖: brew install python3 pip3 install requ ...

  6. 【Java】Class JavaLaunchHelper is implemented in both ** and **

    详细问题描述如下: objc[64179]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachin ...

  7. ProcessBuilder waitFor 调用外部应用

    小程序项目最初使用ffmpeg转换微信录音文件为wav格式,再交给阿里云asr识别成文字.视频音频转换最常用是ffmpeg. 1 ffmpeg -i a.mp3 b.wav 相关文章: 小程序实现语音 ...

  8. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  9. Spring浅入浅出——不吹牛逼不装逼

    Spring浅入浅出——不吹牛逼不装逼 前言: 今天决定要开始总结框架了,虽然以前总结过两篇,但是思维是变化的,而且也没有什么规定说总结过的东西就不能再总结了,是吧.这次总结我命名为浅入浅出,主要在于 ...

  10. 使用webstorm搭建vue-cli项目

    前言 随着vue在前端不断的壮大,越来越多的前端工程师使用vue了,作为大型项目的开发,vue-cli是不二之选,所以这篇博客是为搭建vue-cli所写,想要搭建vue-cli项目就必须先有git,n ...