1、向HashSet 中add()元素时,判断元素是否存在的依据,不仅要比较 hash值,同时还要结合 equles() 方法比较。
2、HashSet 中的 add()方法会使用 HashMap 的 put()方法。
3、HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为 HashMap 的 key,并且在 HashMap 中如果 K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap 比较 key 是否相等是先比较 hashcode 再比较 equals())。
以下是HashSet 部分源码:
private static final Object PRESENT = new Object();
private transient HashMap<E, Object> map;
public HashSet(){
map = new HashMap<>();
}
public boolean add(E e){
//调用 HashMap 的 put 方法,PRESENT 是一个至始至终都相同的虚值
return map.put(e, PRESENT)==null;
}
hashCode()与equals()的相关规定:
1、如果两个对象相等,则hashcode一定也是相同的,hashCode 是jdk根据对象的地址或者字符串或者数字算出来的 int 类型的数值
2、两个对象相等,对两个对象分别调用 equals() 方法都返回true
3、两个对象有相同的 hashcode 值,它们也不一定是相等的
4、综上,equals() 方法被覆盖过,则 hashCode() 方法也必须被覆盖
5、hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。
Was this helpful?
0 / 0