概述:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
概述:
- 底层使用HashMap实现,根据元素的hashCode和equals来判断是否为重复元素。当元素的hashCode相同且equals返回true时则认为是重复元素。
- 因为使用了hash算法所以HashSet有很好的添加和访问性能。
- 可以放入null但只能放一个null
保证元素唯一性需要让元素重写两个方法:
一个是 hashCode(),另一个是 equals()。
HashSet在存储元素的过程中首先会去调用元素的hashCode()值,看其哈希值与已经存入HashSet的元素的哈希值是否相同,
如果不同 :就直接添加到集合;
如果相同 :则继续调用元素的equals() 和哈希值相同的这些元素依次去比较。
如果说有返回true的,那就重复不添加;
如果说比较结果都说false,那就是不重复就添加。
hashCode()与equals()的相关规定:
- 如果两个对象相等,则hashcode一定也是相同的
- 两个对象相等,对两个equals方法返回true
- 两个对象有相同的hashcode值,它们也不一定是相等的
- 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
- hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。
==与equals的区别
- ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存
空间的值是不是相同 - ==是指对内存地址进行比较 equals()是对字符串的内容进行比较
- == 指引用是否相同 equals()指的是值是否相同