java(7)数据容器(2)Set接口 (HashSet TreeSet )

本文深入探讨了Java中Set接口的两种常见实现:HashSet和TreeSet。HashSet依赖哈希算法实现无序且不重复的特性,通过重写equals和hashCode方法过滤重复元素。TreeSet则需要提供排序规则,通过实现Comparable接口确保数据有序。两者在处理自定义类型时,可能需要额外重写相关方法以满足需求。
摘要由CSDN通过智能技术生成

 2. Set接口:  无序不可以重复

                               实现子类:

                                    HashSet   哈希算法    (过滤重复)

                                   TreeSet           (存放数据,一定要给出排序规则)                   

复习一下昨天的,

创建一个链表然后用for循环遍历它,然后计算它遍历的时间,来和迭代器循环遍历的时间对比

栈:

HashSet:

HashSet:(最核心是过滤重复)

底层是哈希表,没有for循环方法开遍历,只可以用迭代器

下两图说明无序且不可重复(没有顺序,自动过滤重复)

 

 

 

这个地方为什么没有过滤重复?

右边这里可以先写 int num;    String name; 然后右键选择source 添加get set 方法和构造函数

 探究其中原因:

每个对象都有个哈希码,哈希码是对象的唯一识别码。

hashCode()方法来自object类,表示对象的识别码。

set在过滤的时候,首先会调用hashcode方法,看两个对象的哈希码是否一样。

 单独的小明值是一样的,(存放在同一个池内存)所以哈希码一样的:

 u1 u2 两个对象和上不同:地址不同

 hashcode方法起作用, 所以重写hashcode

操作:user 右键 source --> ovrride imple....  

重写父类方法,u1. u2 的哈希码都变成100,但是还是2个对象

得到结论:在set接口里:即使哈希码是一样的,也不能够认定两个是重复对象。

哈希码一样,依旧认定是两个对象,因此还有方法来判断是不是重复对象,

字符串判断值是通过哈希码一样,值一样。

 因为,字符串类型的equals方法是判断值(重写了父类)是否一样,而引用类型的equals方法是判断地址是否一样

实际上从数据的实际表现来说u1u2 是同一个对象,根据上面string类重写equals方法,所以user类也可以重写equals方法。

 直接给true,得到值相同,完成过滤重复

 但是这样出现了个问题,给别的序号也会被过滤

 所以,

 从字符串这个类来说,本来就对hashcode方法和equals方法做了判断,所以可以过滤。

但对于引用类型来说就必须重写父类的hashcode方法和equals方法。

总结:使用hashcode方法和equals方法过滤基本数据类型和引用类型过滤重复,

自定义类型使用hashcode方法过滤,必须要重写。

TreeSet     :

自动排序,过滤重复

先定义age 和name 然后创建他们的set get 方法和构造函数。

 为什么这个报错?放到treeset里面的都是需要排序的,所以排序的业务规则需要重写,

 所以在User里面实现 Comparable接口,重写其方法:

 重写:

 之后输出:

TreeSet存放数据,一定要给出排序规则,-》(实现 Comparable接口,重写其方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值