集合框架Set

本文介绍了Java集合框架中的Set接口及其两种实现类HashSet和TreeSet。HashSet是无序不重复的,通过覆写hashCode和equals来判断重复。TreeSet具有自然排序功能,需要实现Comparable接口或提供Comparator来定制排序。同时,文章提到了ArrayList、LinkedList和HashSet、TreeSet的底层实现原理,以及==和equals的区别。

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

							集合框架Set
							Day20------集合框架set

1 Set
Set:下方的接口有两个
在这里插入图片描述

HashSet: 是一个类
在这里插入图片描述

ThreeSet: 是一个类
在这里插入图片描述
在这里插入图片描述

无序,不可重复的容器
不能够添加重复元素

添加重复的元素的时候,就会把它覆盖了,变成一个。而且打印出来的顺序是依次排序的
相对于Lise:
有序可重复。两个相反的。
2 HashSet

构造方法来构造对象
特点:无序不重复的。(添加的顺序是无序的),打印是有序的,添加你可以随意添加

实例:无序是表示添加顺序无序
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
判断重复的标准是:hashcode值一样不一样
造成上边这种结果的解决方案:覆写hashCode

覆写了过后就一样了
在这里插入图片描述
在这里插入图片描述
这儿是把hashCode变成了1,那么后边的所有hashCode都编程1了。

覆写了hashCode之后还是会创建四个对象,这个不会改变的。

如果去掉两个就会比较的是地址了。 比较地址就会用equals来比较

覆写equals之后就变成一个了;
在这里插入图片描述

所以;影响hashset判断的条件就有两个;是用hashcode值和equals值来判断是否重复
实际开发情况:
直接 ctrl+shift+s 点一下生成hashCode方法即可,根据业务需求改变方法。

事实真名:hashcode是无序的,有序只是假象。
在这里插入图片描述
3 TreeSet
他是拥有自然排序的;
在这里插入图片描述
概念:Treeset是会排序的。(是无序不可重复的)
判断重复的标准是: 你要想排序必须实现computerable接口————-覆写computer To方法,
在这里插入图片描述

放入一个Interget类型的数字进去就报错了,而放在HashSet里边就不会
因为:TreeSet是会排序的,而HashSet不会排序的。 这就是导致报错的原因
上述类型为:类型转换异常
接口和实现类的差别:
接口下边实现的类也可以调用接口里边的方法;
Comparable:对实现它的每个类的对象进行排序。

里边有个方法:
在这里插入图片描述
比较
在这里插入图片描述

和传入compareTo(Object obj)里边传入的obj对象是否相等
在这里插入图片描述

实现的是
在这里插入图片描述

如果类要取对对象排序就实现compab就可以了
目的:比较对象
在这里插入图片描述

第一步:实现
在这里插入图片描述

第二步:覆写comparable接口里边的compareTo方法,这是个类
在这里插入图片描述

TreeSet具有排序功能:
在这里插入图片描述

对象的排序。
注意:自定义类的话必须实现接口comparable
功能自己去定义;
在这里插入图片描述

逻辑根据自己去设置;
在这里插入图片描述

在computer接口里边有两个方法,用来指定排序,当没有源码或者别人部门进行排序的时候我们就需要自己定义一个类去实现computer接口,然后覆写里边的computer方法。
在这里插入图片描述

自定义类指定的进行排序。

下方自定义类实现computer接口,
上方就可以new自定义类的对象了,然后在进行排序。
里边会返回三个整数;
0==排序第一个自身。
-1倒着排序
1顺着排序。
这是基于自定义类的排序。记住必须实现接口
在这里插入图片描述

这是自定义类的逻辑排序实现;

4 作业:
2、请说说ArrayList LinkedList HashSet TreeSet 底层的实现原理(建议多多百度几次),目前先了解一个大概
答:ArrayList:
1:底层实现是数组,默认长度是10.
2:add(),判断是否数组越界,是数组扩容为原来的两倍。
3:remove(),copy数组,size-1,释放空虚的空间。
HashSet:
底层实现是一个HashMap,把值存在map的key上,value存的是一个object对象,就是说底层的HashMap中value都是一样的。
HashSet是无序的,不允许重复。
LinkedHashSet:
基础自HashSet,底层实现是一个LinkedHashMap,通过equals()方法比较两个对象是否相等,初始容量16,加载因子0.75f.
使用链表维护数据的顺序,所有说是有序,不重复的,对象都是存在底层map的key上,所有允许有且只有一个对象为null。
LinkedList:
1.LinkedList基于链表实现
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.查找操作indexOf,lastIndexOf,contains等,两者差不多。

3、请说说==和equals的区别
答:==数用来比较基本的数据类型 在比较引用数据类型时比较的时对象的地址
Equals 比较的是对象的属性是否相等。

0、画Collection体系结构图

2、如果一个类已经实现了Comparable接口,然后把这个类的对象放入一个具有比较器的TreeSet,那么TreeSet会按照哪种规则来比较呢?

3、验证TreeSet判断对象是否重复和对象的equals有关系
4、设计一个学生类,具有字段:姓名,年龄,身高字段,然后创建多个学生对象保存到TreeSet中去;请使用自然排序和定制排序(比较器)分别实现如下效果: 先按照年龄排序,如果年龄相等则按照身高排序

### Java集合框架中的Set接口 #### Set接口概述 `Set` 接口是Java集合框架的一部分,继承自 `Collection` 接口。该接口表示不包含重复元素的集合。更具体地说,`Set` 中不允许存在两个相同的对象,即对于任何一对元素 e1 和 e2,在 `Set` 集合中都满足 !(e1.equals(e2))[^1]。 #### 主要特性 - **唯一性**:`Set` 的核心特征在于其成员的独特性;同一对象仅能出现一次。 - **无序性**:大多数情况下,`Set` 不保证元素顺序(某些实现除外),这意味着遍历时元素可能不会按照插入顺序返回[^2]。 #### 常见实现类 常见的 `Set` 实现有: - `HashSet`: 提供常数时间复杂度 O(1) 的基本操作(add, remove, contains),基于哈希表实现,不维护插入顺序。 - `LinkedHashSet`: 继承于 `HashSet` 并保持元素插入时的顺序,同样支持快速访问性能的同时维持了迭代顺序。 - `TreeSet`: 能够自动排序元素,并允许客户端指定排序标准,底层由红黑树结构支撑,因此增删查改的时间复杂度均为O(log n)。 #### 使用示例 下面是一个简单的例子来展示如何创建并操作 `Set`: ```java import java.util.*; public class SetExample { public static void main(String[] args){ // 创建 HashSet 实例 Set<String> hashSet = new HashSet<>(); // 添加元素到 set 中 hashSet.add("Apple"); hashSet.add("Banana"); hashSet.add("Orange"); System.out.println("Elements of HashSet: " + hashSet); // 尝试添加已存在的元素 boolean added = hashSet.add("Apple"); // 返回 false 表明未成功加入新元素 if (!added){ System.out.println("'Apple' already exists in the set."); } // 迭代打印所有元素 (注意这里输出顺序不确定) Iterator<String> iterator = hashSet.iterator(); while(iterator.hasNext()){ String element = iterator.next(); System.out.println(element); } } } ``` 上述代码展示了 `HashSet` 的基础用法,包括初始化、添加元素以及尝试向其中添加已有项的操作结果说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值