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接口,重写其方法)