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一样。