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. 16、mysql主从复制问题总结

    16.1.主库"show master status"没有结果: 1.原因: 主库binlog功能开关没有改或没有生效: 2.解决办法: (1)[root@backup ~]#eg ...

  2. UI自动化学习笔记- Selenium元素等待(强制等待、显示等待、隐式等待)

    一.元素等待 1. 元素等待 1.1 什么是元素等待 概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程 意思就是:等待指定元素已被加载出来之后,我们才去定位该元素,就不会出现定位失败的现 ...

  3. Redis 底层数据结构之整数集合

    文章参考:<Redis 设计与实现>黄建宏 整数集合 整数集合时集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合数量不多时,就会使用整数集合 typedef struct i ...

  4. php 扩展kafka

    一.安装librdkafka cd /usr/local/src/ git clone https://github.com/edenhill/librdkafka.git cd librdkafka ...

  5. 在spring boot使用总结(九) 使用yaml语言来写配置文件

    yaml是专门用来写配置文件的语言.使用yaml来写配置文件扩展性比较强而且十分方便.spring boot支持使用yaml语言来写配置文件,使用snakeyaml库来读取配置文件.spring bo ...

  6. javax.naming.NoInitialContextException:Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

    小弟初次用JNDI,使用数据源连接数据库,配置完相关的xml文件后,激动的我赶紧测试了一下,结果悲剧了,报出了错误: javax.naming.NoInitialContextException:Ne ...

  7. leetcode1047

    思路分析,这题是在栈分类的题目的,所以顺便复习下数据结构,先用java现成的,就当复习了. 1.判断栈顶和插入的元素是否相等,如果相等,那就出栈,不相等入栈结束 java版:

  8. 如何使用Jdk查看源码?

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 最近,有很多读者问我,有没有j ...

  9. Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录

    1.  前言 实话实说,网上关于Activiti的教程千篇一律,有参考价值的不多.很多都是老早以前写的,基本都是直接照搬官方提供的示例,要么就是用单元测试跑一下,要么排除Spring Security ...

  10. GO系列-ioutil包

    ioutil包提供给外部使用的一共有1个变量,7个方法. // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情 // 并且始终成功返回. var Disca ...