Java集合学习3:Set集合-TreeSet

简介: 基于hashcode计算元素存放位置。当存入元素的哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入。

HashSet回顾


基于hashcode计算元素存放位置。

当存入元素的哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入。


TreeSet(红黑树)


基于排列 顺序实现,元素不重复

实现了SortedSet接口,对集合元素自动排序。

元素对象的类型必须实现Comparable接口,指定排序规则。

通过 CompareTo方法去确定是否为 重复元素。


红黑树


二叉查找树

TreeSet的使用

存储结构是红黑树。

aec77f575071869d4129888a21d00586_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_11,color_FFFFFF,t_70,g_se,x_16.png

第二个xyz是不可以加进来的。


7d11c234e071240f91f83224bd5aeb38_fbe7e0fae3e545a991ffc6f158e456ab.png


红黑树的遍历:

1a3dbcf187aa1b09469b41767bf08a6d_f588c6e18b6e4053854ba4502d7701b2.png

e67c2f1a4605430eb35c1708091bc216_f58a420c2dd842e0b9b922a5e2eebbc9.png

0a794a2cc721023ce929ec8bf339d0e3_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_11,color_FFFFFF,t_70,g_se,x_16.png


现在如果 要加数据,那么怎么进行比较呢 ,就是如果转成coomparable,就是说如果要 把person加入到treeset中,必须实现comparable接口。

351c508bd0e5e1fff2d1e952d1b738d7_a1c25b9c1bae4633aa5412378f958375.png

这个接口是泛型的,所以这个T改为Person即可。

实现接口,所以 必须 实现 接口 里面的抽象方法!

comparable里面只有 一个方法,也就是compareTo方法。

bae903dec3d50d989dfdd796fa39d84f_6a91e6f1dac84690a3a17340797c2de2.png

900390ef2a8d89cd3d4916054817002a_5a40c50d13304b69b33e71fb90daa6a3.png


先按照姓名来比较,然后再按照年龄进行比较。


当compareTo方法的返回值为0,认为是重复元素,不能添加进来。

7cc0c073069e11c882bd70ce2bd71966_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_13,color_FFFFFF,t_70,g_se,x_16.png


Comparator比较器的使用:定制比较

8818f597b2aaa8dd9fd5b8a3cff8eedc_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_16,color_FFFFFF,t_70,g_se,x_16.png

那么就是不需要实现comparable接口了。

这里使用匿名内部类 的实现 来进行实现。

fc230c36002015ca8735b9630a64ec14_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_15,color_FFFFFF,t_70,g_se,x_16.png


TreeSet使用案例


使用TreeSet集合实现字符串按照长度进行排序。

5722cc027a55938cff1e0d8a420d7821_b30d1a91253b407aa8d64093548f6094.png

4b2506c92383f4ad8600ab650439fcec_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_16,color_FFFFFF,t_70,g_se,x_16.png

注意,是先比较长度,如果长度一样,就比较n2用他们自己的方法compareTo。

315923706e36fc5c169cdf09f0fa67c7_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_15,color_FFFFFF,t_70,g_se,x_16.png

相关文章
|
19小时前
|
存储 算法 搜索推荐
滚雪球学Java(27):从零开始学习数组:定义和初始化
【5月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
7 3
|
2天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
9 0
|
2天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
7 0
|
2天前
|
Java 索引
【JAVA基础篇教学】第九篇:Java中Set详解说明
【JAVA基础篇教学】第九篇:Java中Set详解说明
|
2天前
|
缓存 Java 数据库
Java并发编程学习11-任务执行演示
【5月更文挑战第4天】本篇将结合任务执行和 Executor 框架的基础知识,演示一些不同版本的任务执行Demo,并且每个版本都实现了不同程度的并发性。
20 4
Java并发编程学习11-任务执行演示
|
4天前
|
数据库连接
java+ssm+vue代码视频学习讲解
java+ssm+vue代码视频学习讲解
6 0
|
4天前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
11 0
|
Java API C语言
Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeSet进行学习。我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet。内容包括:第1部分 TreeSet介绍第2部分 TreeSet数据结构第3部分 TreeSet源码解析(基于JDK1.
1502 0
|
1天前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
9 3
|
1天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
12 2