一、Set集合如何过滤重复元素?
以hashSet为例, 添加了五个元素,有一个重复的,没有添加进去,主要是因为,hashSet调用的是hashMap,创建的Map对象,而由于Map是键值对key 和value 两部分组成,其中key是唯一的,而set集合使用Map对象,将自己的元素以键值对中的key存入,value以一个常量存入的。
更通俗一点来说,Set集合是通过判断存入元素的哈希值来判断的,如果哈希值不一样,则元素一定不一样,但是如果哈希值一样,也不能说两个元素一样,因此,这是就需要比较元素的内容(t通过equals方法)来判断元素是否一样了,
二、为什么重写hashCode()时,必须重写equals()?
因为,hashCode在底层保存的格式一个int整型数据,而int类型的范围【-2147483648,2147483647】,由于int范围有限,因此,当数据溢出是有可能两个元素 的哈希相等,但是其实两个元素不等,这时,就需要使用equals()来比较两个元素的内容,进一步判断元素是否相等,若返回true ,则相等同一元素,反之,则是不同元素。
因此,当需要比较两个对象是否相等时,我们就可以先使用 hashCode 进行比较,如果比较的结果是 true,那么就可以使用 equals 再次确认两个对象是否相等,如果比较的结果是 true,那么这两个对象就是相等的,否则其他情况就认为两个对象不相等。
三、为什么会产生哈希冲突?
因为,hashCode在底层保存的格式一个int整型数据,而int类型的范围【-2147483648,2147483647】,由于int范围有限,因此,当数据溢出是有可能两个元素 的哈希相等
例如:"重地","通话" 哈希相等,但是元素是不同的两个个体。