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. 信息论估计工具jidt基本使用

    JIDT基本介绍 JIDT是 Java Information Dynamics Toolkit的简称,用于研究复杂系统中信息论相关度量的计算,它是一个基于java的开源工具库,也可以在Matlab. ...

  2. Quartz:Quartz定时代码实现

    1.添加pom.xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...

  3. 南京大学计算机基础 ELF和可执行文件格式

    1.可重定位目标文件格式 主要是由ELF头,一些节比如.text节,.rodata节,.data节,.bss节等,前面是只读的,后面是可读可写的,加上一个节头表 1.1 ELF头里面主要包含了16字节 ...

  4. 递推算法,AI衍生

    引言 最近在刷leetcode算法题的时候,51题很有意思: 题目是这样的: n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击.给你一个整数 n ,返回 ...

  5. bat自动创建快捷方式并更换图标

    1 :: 此脚本主要的作用创建1.自动创建快捷方式:2.自动更换快捷方式图标 2 @echo off 3 >nul 2>&1 "%SYSTEMROOT%\system32 ...

  6. 常见数据库SELECT结果只显示前几条记录方法汇总

    常见数据库SELECT结果只显示前几条记录方法汇总 为了查看数据表中的数据情况.经常会遇到想让查询结果只显示N行,比如只显示10行的情况.不同的数据库有不同的关键字和SELECT实现语法. 1.SQL ...

  7. ES 基础知识点总结

    为什么使用 ES? 在传统的数据库中,如果使用某列记录某件商品的标题或简介.在检索时要想使用关键词来查询某个记录,那么是很困难的,假设搜索关键词 "小米",那么 sql 语句就是 ...

  8. github在不同电脑上协同开发

    当我换了电脑后,开发自己的github项目遇到了一些问题. 首先,git clone 'repository url'拉取下来项目,开始开发项目发.修改了一些文件后,当要git commit, git ...

  9. springboot-2-IOC容器的基本注解

    @Configuration 告诉springboot这是一个配置类,用于补充IOC容器, 示例: @Configuration //告诉springboot这是一个配置类,作为IOC容器的自定义补充 ...

  10. 【超值分享】为何写服务器程序需要自己管理内存,从改造std::string字符串操作说起。。。

    服务器程序为何要进行内存管理,管中窥豹,让我们从string字符串的操作说起...... new/delete是用于c++中的动态内存管理函数,而malloc/free在c++和c中都可以使用,本质上 ...