Java集合框架之TreeSet浅析
Java集合框架之TreeSet浅析
一、TreeSet综述:
1.1TreeSet简介:
TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧:
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
一种基于
TreeMap的NavigableSet实现。因为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, 返回此 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,返回此 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, 返回此 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浅析的更多相关文章
- Java集合框架之TreeMap浅析
Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:
- Java集合框架之HashMap浅析
Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...
- Java集合框架之HashSet浅析
Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...
- Java集合框架之Vector浅析
Java集合框架之Vector浅析 一.Vector概述: 位于java.util包下的Vector是Java集合框架的重要一员,虽然没有ArrayList那么的常用,但是我们还要对其做相关学习: 1 ...
- Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
- Java集合框架之ArrayList浅析
Java集合框架之ArrayList浅析 一.ArrayList综述: 位于java.util包下的ArrayList是java集合框架的重要成员,它就是传说中的动态数组,用MSDN中的说法,就是Ar ...
- Java集合框架之TreeSet
简述 TreeSet是基于TreeMap作为存储的可排序.可去重的有序集合 继承于AbstractSet,AbstractSet实现了equals和hashcode方法 实现了NavigableSet ...
- Java集合框架系列大纲
###Java集合框架之简述 Java集合框架之Collection Java集合框架之Iterator Java集合框架之HashSet Java集合框架之TreeSet Java集合框架之Link ...
- Java集合框架之Set接口浅析
Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...
随机推荐
- EF Core懒人小技巧之拒绝DbSet
前言 最近在项目中使用EF Core的频率越来越高,当项目比较大的时候,疯狂往DbContext中加各种DbSet,你会不会特难受?如果你是一键生成的大佬,那么请忽略本文.本文旨在不写 DbSet,那 ...
- linux初学者-DNS配置篇
linux初学者-DNS配置篇 DNS在之前的网络管理篇已经做过介绍,下文将叙述DNS在学习工作中的一些配置以及应用. 1.高速缓存DNS 一台主机通过DNS服务器询问域名解析IP是需要一定的时间的, ...
- mac 下搭建安装 sass
一.安装系统需要的包 安装Xcode开发工具,它将帮你安装好 Unix 环境需要的开发包 打开 App Store,搜索 Xcode,第一个就是,对了,有4个多G,网速如果不大好,就请先厕所哭会儿吧, ...
- "A valid provisioning profile for this executable was not found"问题
时间:2015年8月14日 初接触iOS,这两天真机调试的时候遇到了这个问题.如图所示: 上网查后发现,解决方法大致有以下两种: 1. provisioning profile没有被找到,需要重新导入 ...
- .Net集合详解
前言 前面几篇文章讲了泛型.讲了数组,都有提到集合,这一节重点对集合进行详细解说.本文主要使用各种集合类型.以至于评估其性能,针对不同的场景选择不同的集合使用. 集合分类详解 一.列表 列表的创建 v ...
- python中的赋值操作与C语言中的赋值操作中的巨大差别
首先让我们来看一个简单的C程序: a = ; b = a; b = ; printf("a = %d, b = %d\n", a, b); 相信只要学过C语言, 不用运行程序便能知 ...
- Windows上的Linux容器
翻译自:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-contai ...
- 想成为顶尖 Java 程序员?请先过了下面这些技术问题。
一.数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度. 用Java写一个冒泡排序算法 描述一下链式存储结构. 如何遍历一棵二叉树? 倒排一个LinkedList. 用Java写一个递归遍历目 ...
- centos虚拟机配置静态ip
昨天在配置虚拟机的时候因为之前没有设置静态IP,而是使用DHCP动态分配的,导致关机后下次开机虚拟机的ip是随机变动的.严重影响了工作体验啊,遂设置静态ip以保全! 虚拟机使用的是CentOS6.5, ...
- Java虚拟机——Java内存区域
1.运行时区域 Java虚拟机在执行Java程序的时候会把它管理的内厝划分为若干个不同功能的数据区域,如图所示 首先是程序计数器,程序计数器可以理解为当前程序执行的字节码的行号指示器,计数器中的数据即 ...