set 集合

本文介绍了Java集合框架中的Set集合,重点讲解了HashSet保证元素唯一性的原理以及TreeSet的自然排序和自定义排序。讨论了泛型的作用和用法,包括泛型方法、泛型类以及泛型接口。还提到了泛型限定,如?Extends和?Super的使用场景。

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

【集合框架 set】

1、set集合里元素的特点:

①元素存入和取出的顺序不一定一致

②元素不可以重复

2、HashSet哈希表存储:

底层数据结构——哈希表

HashSet存入重复元素(以人为例),同姓名同年龄视为同一个人 ,重复元素

从代码上看,equals方法没有被调用,是因为HashSet集合存储是先调用hashCode方法,可以重写hashCode方法做一下对比!

3、HashSet如何保证元素的唯一性

是通过元素的两个方法:

hashCode方法、equals方法(注意:判断元素是否存在,以及删除等操作时,依赖的同样是hashCode方法、equals方法。)

如果hashCode值相同——判断equals是否为true;

如果hashCode值不同——不会调用equals方法。

4、List与Set判断重复对象的区别?

List——只依赖于equals方法

Set——依赖于hashCode、equals方法

补充:

set集合的功能与Collection集合的功能在方法调用上是一致的。


集合框架TreeSet

1、TreeSet自然排序

TreeSet可以对set集合中元素进行排序;

String实现了Comparable接口,可以直接进行排序;

引用数据类型想要排序,必须实现Comparable接口;

其他引用数据类型没有实现Comparable接口,那么会出现错误(java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable),解决办法 : 引用数据类型实现此接口。

注意:排序时,当主要条件相同时,一定要判断次要条件。

2、TreeSet数据结构

底层数据结构是二叉树,可以对set集合进行排序;

保证元素唯一性的依据是,compareTo方法return 0;

注意:
TreeSet 排序的第一种方式,让元素自身具有比较性;
元素需要实现Comparable接口,覆盖compareTo方法;
这种方式也被称为元素的自然顺序,也叫做默认顺序。

二叉树排序:

以第一个数为例,后面的数字与前面的数字相比较,若后面的数字比前面的小,则排在前面数字的左边,同理,若后面的数字比前面的大,则排在前面数字的右边。
如图所示(画的有点灵魂出窍了,不好意思啦!O(∩_∩)O):

二叉树排序
3、如何让TreeSet集合中的元素怎么存进去怎么取出来呢?

compareTo方法返回值为正数,返回值写死,那么就是怎么存进去怎么取出来。

compareTo方法返回值为负数数,返回值写死,那么就是先进后出。

4、TreeSet比较器排序

TreeSet排序的第二种方式

当元素自身不具备比较性时,或者具备的比较性不是所需要的
(注意:这时需要让集合自身具备比较性,在集合初始化时,就有了比较方式;);

定义一个类,实现comparator接口,实现compare方法

当两种排序都存在时,比较器排序优先级更高。

因此,比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定,那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法 。

两个案例说明:

1、打破原有的person排序规则进行排序

2、按照字符串长度进行排序(String默认是按照hashCode值进行排序的)


泛型

1、泛型方法在哪里使用?

在Jdk1.5以后出现的新特性(本人使用jdk1.8),用于解决安全问题,是一个安全机制

2、泛型的作用 有哪些?

①将运行时出现的异常ClassCastException,转移到了编译时期,方便于程序员解决问题,让运行时期问题减少,更加安全;

②避免了强制转换的麻烦,Comparable接口以及comparator接口就体现了泛型的应用。

3、什么时候定义泛型类?

当类中要操作的引用数据类型不确定的时候,需要定义泛型来完成扩展,将运行时的异常转移到编译时期

4、泛型方法

泛型类定义的泛型,在整个类中有效,如果被方法调用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

5、将泛型定义在方法上的作用:

为了让不同方法可以操作不同的类型,而且类型还不确定。

补充:

泛型类泛型与泛型方法泛型可以同时存在

6、静态方法泛型

静态方法不可以访问类上定义的泛型,要先new对象才有泛型;

若静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。

7、泛型接口

分为两种:

①实现泛型接口的时候就指定具体引用数据类型;

②实现泛型接口的时候仍然不指定引用数据类型,在使用接口实现类的时候在指定泛型的具体数据类型。


泛型限定

(注意: ? 通配符,也称为占位符)

泛型的限定:

? Extends E:可以接受E类型或者E的子类型,上限定

? Super E:可以接受E类型或者E的父类型

containsAll(Collection<?> c)
若该collection包含指定collection中所有元素,则返回true。

addAll(Collection<? extends E> c)
将指定collection中的所有元素都添加到该collection中(可选).

IreeSet(Comparator<? super E> comparator)
构造一个新的TreeSet(为空),根据指定比较器进行排序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值