集合,Set实现类笔记

本文深入解析Java集合框架中的HashSet和TreeSet的内部实现原理,包括元素唯一性保证机制、添加操作细节以及如何通过自定义比较器实现排序功能。同时,介绍了HashSet和TreeSet的基本使用方法,以及它们在实际开发中的应用场景。

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

回顾:
List体系

栈:

队列:

数组:

链表:

List体系的三个子类
ArrayList -- 数据结构 数组

Vector -- 数据结构 数组
特有功能


LinkedList -- 数据结构 链表
特有功能
First
Last
面试题: 模拟栈结构

泛型:明确数据类型的工作放在创建对象 或者 调用方法的时候
类型转换异常

三个应用:泛型接口   泛型类   泛型方法

Arrays工具类
toString()
sort()
binarySearch()



1、 Set
特点:元素无序 , 唯一
注意这个顺序,指的是元素存入和取出的顺序

set是一个不包含重复元素的 collection
HashSet它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

HashSet元素无序的解释:
要理解这个问题应该考虑到Set是个接口。接口的规则很单纯,不会做过多的保证。
Set的规则重点就是“元素不重复的集合”,而对顺序不做保证。
实现该接口的类既可以提供有序的实现,也可以提供无序的实现。 
HashSet在保存数据的时候显然还是得按一定顺序放入其中(通过hash算法),但顺序不是用户可控制的,对用户来说就是“无序”。

HashSet add源码分析

HashSet 里面封装了 hashMap

调用HashSet的 add()  实际走 hashMap的put()

put()方法里面 首先去算了对象的hash值 -- 调用对象的hashCode()

(e.hash == hash && ((k = e.key) == key||key.equals(k)))

如果hash值不等,直接断定元素不一样,添加
如果相等,走后面的判断 e.key == key  ||  key.equals(k)  依赖于equals() 方法。

如果equals返回的也是true,那么元素重复了。

结论:HashSet保证元素唯一 依赖于元素的 hashCode()  和 equals() 方法

HashSet 重复的元素,添加失败。
TreeSet 重复的元素,也是添加失败的。


TreeSet 里面对元素进行了自然排序。


TreeSet 对元素进行排序:
1.让元素具有比较性 -- 实现Comparable 接口
根据compareTo()方法的返回值,来判断元素的顺序,并保证元素的唯一。
正数:元素往后放
负数:元素往前放
0:表示元素重复,不添加。
2.让集合具备比较性 , 使用集合的带参构造
TreeSet(Comparator comparator) 

-- 建议大家使用这种方式:开发原则 -- 对修改关闭,对扩展开放。
自定义比较器去实现Comparator接口。


构造一个新的空 TreeSet,它根据指定比较器进行排序。

需求:我想按学生的年龄排序:
this.age - s.age


需求1:按照对象的年龄排序,从小到大排序


public int compareTo(Student s) {
// 需求是比较年龄
int num = this.age - s.age;
// 由于对象有多个成员变量,你不能根据其中的某一个决定其他的。
// 当某一个相同的时候,你还需要判断其他的是不是也是相同的。
int num2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
return num2;
}
}
需求2:按照对象的姓名长度,从小到大排序,怎么做?



TreeSet 底层数据结构是二叉树
满二叉树  完全二叉树

保存数据的时候: 第一个元素先放到跟节点。其他的元素进来 与根节点比较
如果小,放左边
如果大,放右边。
如果一样,替换。
取出:从根节点开始拿,按照左中右的顺序。


匿名内部类回顾:
格式:
new 接口或抽象类名 () {
// 重写抽象方法
}

Collections 工具类:
排序: sort(List list)
二分查找:binarySearch(List list)
反转 : reverse(List list)
随机置换: shuffle(List list)

最值:max / min (Collection c)










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值