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

相关文章
|
2月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
318 0
|
2月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
319 7
|
2月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
235 1
|
2月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
110 7
|
3月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
84 5
|
3月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
166 1
|
3月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
159 5
|
存储 Java 开发工具
TreeSet子类排序操作 | 带你学《Java语言高级特性》之一百零五
本节分析了TreeSet子类排序操作和重复元素消除的过程。
TreeSet子类排序操作 | 带你学《Java语言高级特性》之一百零五
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
198 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
223 1