TreeSet 集合主要是实现了Collection集合的实现类,主要框架为:

 1. Set接口的框架:
|----Collection接口:单例集合,用来存储一个一个的对象
|----Set接口: 存储无序的,不可重复的数据 ---->“”
|--->HashSet 、: 作为Set接口的主要实现类;线程不安全的,可以存储null值
|--->LinkedHashSet、:作为HasSet的子类,遍历其内部数据时,可以按照添加的顺序去遍历,
对于频繁的遍历操作,LinkedHashSet 效率高与HashSet。
|--->TreeSet:可以按照添加的对象指定属性进行排序。
TreeSet主要用途是:实现自定义类,或者其他类型的比较排序,分为 自然排序和 定制排序。
向 TreeSet 集合中添加数据,要求是相同类型的对象。
同时我们添加自定义类的过程中,需要实现Comparable接口,并实现compareTo方法。

关于Set接口的特性如下:
Set:存储无序的,不可重复的数据
以HasSet为例说明:
1.无序性: 不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。

2.不可重复性:保证添加的元素按照equals() 判断时,不能返回true。即;相同的元素只能添加一个


值得注意的是:TreeSet 与HashSet 、LinkedHashSet不同:后者都是通过重写hashCode()、及equals()方法去判断内容是否相同,
而TreeSet是通过比较器去判断内容是否相同。
自然排序中,比较两个对象是否相同的标准为:compareTo()返回0,不再是equals()。
定制排序中,比较两个对象是否相同的标准为:compare()返回0,不再是equals()。

如:我们在TreeSet中添加不同的数据类型会异常。
TreeSet set = new TreeSet();
// 失败: 不能添加不同类的对象
// set.add(123);
// set.add(456);
// set.add("TOM");
所以在用TreeSet中,我们需要添加的是相同的数据类型:
set.add(new Person("tom",22));
set.add(new Person("jak",21));
set.add(new Person("dd",44));

关于Comparator接口的用法,我们可以在创建Comparator接口的时候,重写compare方法,实现制定排序的逻辑,同时将Comparator对象传入
TreeSet构造器中。如下:
public void test2(){
Comparator com = new Comparator() {
// 按照年龄从小到大排列。
@Override
public int compare(Object o, Object t1) {
if (o instanceof Person && t1 instanceof Person){
Person p1 =(Person)o;
Person p2 =(Person)t1;
return Integer.compare(p1.getAge(),p2.getAge());
}else {
throw new RuntimeException("输入的数据类型不匹配");
}
}
};
TreeSet set = new TreeSet(com);
关于Comparable接口的实现,在自定义类中,重写compareTo方法。具体如下:
// 按照姓名从小到大排列,起床年龄 从小到大排列
@Override
public int compareTo(Object o) {
if (o instanceof Person){
Person p = (Person)o;
// return this.name.compareTo(((Person) o).name);
// 在 TreeSet当中,他是根据compareTo的方式去比较的,如果返回的是0 则表示是相同数据,所以这边需要二重判断,先
//判断名字是否一样,如果是 返回0 在判断 年龄是否一样,这样就可以添加数据了
int conpare = this.name.compareTo((p.name));
if (conpare!=0){
return conpare;
}else {
return Integer.compare(this.age, p.age);
}
}else {
throw new RuntimeException("输入的类型不匹配");
}
}


 

关于TreeSet集合的理解的更多相关文章

  1. TreeSet集合解析

    TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简析 假如有这么一个集 ...

  2. TreeSet集合的自然排序与比较器排序、Comparable接口的compareTo()方法

    [自然排序] package com.hxl; public class Student implements Comparable<Student> { private String n ...

  3. 详解java中的TreeSet集合

    TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简述 假如有这么一个集 ...

  4. 对JAVA的集合的理解

    对JAVA的集合的理解是相对于数组 1.数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) 2.JAVA集合可以存储和操作数目不固定的一组数据.  3.所有的JAVA集合都位 ...

  5. TreeSet集合深入了解--------攻击原理

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.(无序,不可重复 )Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说 ...

  6. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  7. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  8. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  9. TreeSet集合

    TreeSet集合 TreeSet集合是一个依靠TreeMap实现的有序集合,内部存储元素是自动按照自然排序进行排列,所以如果想要保留存储时的顺序,那么就不建议使用TreeSet. TreeSet继承 ...

随机推荐

  1. 关于 Index '8' specified is out of bounds.

    报类似这样的错误暂时我只发现了两个原因: 1, 数组超出了界线,这个自己多多注意,加判断,在循环的时候看看是不是有结束条件 2, 你需要提交的网页不存在.有可能是因为你没有这个文件.可能是你的文件名错 ...

  2. Datahub 0.8.5发布! 通用的元数据搜索和发现工具

    近期Datahub 发布了最新的版本0.8.5,作为LinkedIn开源的通用的元数据搜索和发现工具.Datahub近一年来有了巨大的发展,也成为了很多公司进行元数据管理的调研方向并进行使用的选择. ...

  3. 13.6Comparable接口

    要点提示:Comparable接口定义了conpareTo方法,用于比较对象. public interface Comparable<E>{ piblic int compareTo(E ...

  4. 重新整理 .net core 实践篇————配置中心[四十三]

    前言 简单整理一下配置中心. 正文 什么时候需要配置中心? 多项目组并行协作 运维开发分工职责明确 对风险控制有更高诉求 对线上配置热更新有诉求 其实上面都是套话,如果觉得项目不方便的时候就需要用配置 ...

  5. SpringBoot:springboot项目jar包如何引入外置配置文件

            springboot项目打成jar包,默认读取的classpath路径下的配置文件,config.properties是自定义配置文件. 如果要把config.properties配置 ...

  6. 如何用Redis统计独立用户访问量

    拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢? 使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表 ...

  7. Shell 脚本之 MySQL 一键安装及基本配置(几分钟搞定)

    准备工作 MySQL 该版本下载地址: https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12- ...

  8. Luogu P4553 80人环游世界

    link 题目大意 自东向西有 \(n\) 个国家.有 \(m\) 个人,他们可以选择 \(n\) 个国家中任意一个开始,任意一个结束,但路线必须自东向西,且第 \(i\) 个国家必须恰好经过 \(v ...

  9. 【论文阅读】PRM-RL Long-range Robotic Navigation Tasks by Combining Reinforcement Learning and Sampling-based Planning

    目录 摘要部分: I. Introduction II. Related Work III. Method **IMPORTANT PART A. RL agent training [第一步] B. ...

  10. 如何修改product.product的display_name的显示,解决_rec_name失效的问题

    回顾学习 之前有讲解过display_name是怎么由来的,odoo会去取_rec_name的值,会将_rec_name的值赋值给display_name. class FandxProduct(mo ...