set集合在添加元素时,实际上底层添加到HashMap中,
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
private transient HashMap<E,Object> map;
要传入的元素作为Key值,创建Object对象作为虚拟值,
private static final Object PRESENT = new Object();
因为底层时hash表,所以存值时需要进行hash比较,存放值时进行hashcode比较
@Override
public int hashCode() {
return Objects.hash(id, name);
}
比较完之后仍然不能确定该位置上的值是否相等,需要进行equals比较值是否相等。
hash表底层原理:数组+链表,进行遍历判断。
Arrays.hashCode(values);
如果key值相同,将会覆盖,这就是set为什么能去重的原因(key相同会覆盖)。