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

相关文章
|
4天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
3天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
4天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
4天前
|
Java 开发者
|
3天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
6 0
|
6月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
3月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
3月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
16天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
45 5
|
3月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List