Java系列课程第十六天(Set、比较器)

本文详细介绍了Java中的Set集合,特别是TreeSet,包括其底层数据结构、排序原理以及如何使用比较器进行排序。讲解了Comparable和Comparator的区别,并强调在自定义类型时如何选择合适的比较方式。此外,还提及了泛型的概念及其在集合中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day16 Set、比较器

1. 集合
1、java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象

2、集合的作用

  a、在类的内部,对数据进行组织

  b、简单而快速的搜索大数量的条目

  c、有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关的元素

  d、有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以使任意类型

3、与数组对比,选择集合

 a、数组的长度固定,集合长度可变

 b、数组只能通过下标访问元素,类型可变,而有的集合可以通过任意类型查找所映射的具体对象

1.1 Set
set中保存的数据是无序不可重复的
TreeSet : 底层是红黑树(保证元素按照某种顺序排序)
HashSet : 底层是散列

1.1.1 TreeSet
1.1.1.1 概述
java.util/SortedSet
java.util.TreeSet:会按照某种顺序进行排序
数字:从小到大
自符串:每位的ASCII
日期:自然日期

比较器有两种
要添加的元素实现比较器
专门准备一个比较类(优先级高)
进行排序的时候,根据比较器方法的返回值进行比较
如果是0说明重复不添加 如果是大于0的 说明元素大往后放
如果是小于0的,说明要添加的元素小,往前放

1.1.1.2 基本使用
在这里插入图片描述
1.1.1.3 注意
如果要使用treeSet 那么 元素必须有比较器,两种都可以
否则就会有类型转换异常
1要添加的原始实现java.lang.Comparable接口并实现compareTo方法2写一个比较器类,实现java.util.Comparator比较器接口
很多常用的类中都实现了Comparable接口并实现compareTo方法比如Integer,String,Date等
所以我们自定义类型的时候,一定要弄比较器类
在这里插入图片描述
1.1.2 比较器
可以让集合中的元素按照某个规则进行排序
在源码中体现了,先判断是否有compare() 如果没有再判断是否有compareTo()
在这里插入图片描述
所以 Comparator优先级要高于Comparable

1.1.2.1 Comparable
也可以叫元素自身比较器,就是要添加的元素需要实现这个接口,一般在我们的自定义类中常用
因为这种方式,直接让要添加的元素类实现接口就可以,编码方便,而Comparator需要单独写比较器类
因为它优先级低,我们给出的排序规则,如果不满足调用处,它还可以根据Comparator进行排序扩展
此时当调用处进行排序扩展的时候,此时Comparator和Comparable同时存在,则Comparator优先级高,所以最终排序规则会按照调用处指定的规则进行排序
在这里插入图片描述1.1.2.2 Comparator
1 该类有排序(比如Integer实现了Comparable,并且是升序),但是排序规则不是我们想要的,这个时候需要使用Comparator来进行调整排序,因为优先级高
2 如果该类没有排序(没有实现Comparable接口),该类也不是我们写的,如果此时需要排序,则需要使用Comparator来完成
在这里插入图片描述
1.1.3 List排序
在这里插入图片描述
所以 如果保存我们自定义类型,想要排序,必须有一个比较器类
根据需求决定用哪一种即可
在这里插入图片描述
1.2 泛型
1.2.1 概述
类型检查,编译过程中检查类型是否匹配
泛型是在编译阶段对数据的类型进行匹配
优点:统一了数据类型,减少强制类型转换
缺点:只能存储单一类型的数据
结合我们的需求情况,绝大部分情况都是需要保存统一类型的数据,所以大部分情况下,使用泛型要好很多
泛型只能是引用类型,不能是基本类型

1.2.2 基本使用
在这里插入图片描述
在这里插入图片描述
1.2.3 自定义泛型
泛型本质就是一个占位符,由调用处对这个占位符赋值
如果不赋值,默认是Object
常见的占位符:
?:表示不确定的类型
T:表示一个具体的java类型 Type K:表示keyjava中的键值对V:表示value,E:表示Element,元素,集合中的数据我们叫元素
用什么字母都是可以的,一般都是大写,只是占位符而已
自定义泛型
public class Linked
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值