javaSE复习之——HashSet类
概述
他没有自己特殊的方法,它的方法和Collection一样,HashSet集合
不能存重复的数据
,并且是无顺序
的。
特点:
1、没有索引
2、不可以重复
3、无顺序(存和取不一致)
为为什么要存储自定义对象
因为别人的类我们不知道它重写了哪些方法来保证元素的一致性。
HashSet集合存集合的原理
加入每个元素都会先调用
hashCold
方法来生成一个Hash值,这个值就相当于存那个元素的地址,如果hash值不一样就不会调用equals方法
判断,如果hash值相同就通过equals方法对比在同一个地址中
的数据是不是相同的,相同丢弃不相同就存入。
HashSet中遇到的常见问题:
- 为什么在集合中存入自定义对象的时候
重复的数据
也会被存进去?原因1:
因为父类的hashCold方法会为每一个元素生成不一样的hash值,所以导致地址不一样
原因2:
父类的equals方法对比的时对象的地址,而不是对象里面的值解决方法:
在自定义的类中重写equals方法和hashCold方法
为什么尽量使用计算hash值
的方法来判断两个我们知道相等的对象是否相等
?
原因:
HashSet集合加入元素的顺序是先判断hash值
如果hash值一样就调用equals判断,如果我们用算法让相同的对象值计算出相同的hash值
,不同的对象值计算出不同的hash值
,那么就可以让程序少调用一次equals方法
,这样可以提高效率。注意事项:
重写hashCold方法时,属性相同
的对象hash值一定要一样,属性不一样
的对象hash值要尽量不一样(提高效率)
重写hashCold中的面试题:
- 为什么使用Eclipse重写的hashCold方法中,为了让传入对象计算的hash值不一样,而定义的一个用来算法计算的值是31?
原因1:它是一个质数,它只能被1和本省整除,这样可以减小两个对象计算的hash值相同的概率
原因2:31这个数不大也不小,太小了计算的值容易重复,太大了容易超过int范围。
原因3:31这个数好算,它是2的5次方-1,也就是2的二进制位向左移动5位。
LinkedHashSet的概述
它的底层是
链表
实现,并且是非线程安全的,也是Set集合中唯一 一个
能保证怎么存就怎么取的集合对象,因为它的父类是HashSet,所以也是保证元素唯一
的,它的原理与HashSet一样。