HashSet底层结构是一个HashMap,HashSet将值放在HashMap的键中,如果HashMap的键相同时会发生覆盖,因此HashSet的值不会重复。HashMap检查Key是否相同会通过equles方法,并通过比较hash值判断是否重复。
//PRESENT是一个空的对象
private static final Object PRESENT = new Object();
private transient HashMap<E,Object> map;
//HashSet的构造方法
public HashSet() {
//创建一个HashMap
map = new HashMap<>();
}
//如果触发HashSet的add方法
public boolean add(E e) {
// PRESENT是一个不变的固定值
return map.put(e, PRESENT)==null;
}
hashCode()和equals():
-
如果两个对象相等,其hashcode也相等
-
如果两个对象相等,其equals方法会返回true
-
hashcode相等,对象不一定是相等的
-
如果重写equals方法,那么也要重写hashcode方法
-
hashcode是堆中对象产生的独特值,如果没有重写,那么该类的对象不会相等