HashSet执行add
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(1);
点进add方法
查看PRESENT是什么
为什么这个要让Object作为Value存入呢
HashSet底层其实就是维护着HashMap,HashSet的add方法,其实是将值,作为HashMap的key存入。
而如果HashSet的value 用null值的话,那么在删除操作的时候,可能remove方法返回的值就永远都是true了。
下面我们证明一下
我们先用jdk1.8的HashSet来写一个
public static void main(String[] args) {
HashSet<A> hashSet = new HashSet<>();
A a = new A();
A b = new A();
hashSet.add(a);
hashSet.add(b);
//删除同一个key
System.out.println(hashSet.remove(a));
System.out.println(hashSet.remove(a));
System.out.println(hashSet.size());
}
class A{
}
输出如下
再用自己写的HashSet来实现一下,插入的value都为null的情景
public static void main(String[] args) {
MyHashSet<A> myHashSet = new MyHashSet<>();
A e = new A();
A f = new A();
myHashSet.add(e);
myHashSet.add(f);
System.out.println(myHashSet.remove(e));
System.out.println(myHashSet.remove(e));
System.out.println(myHashSet.size());
}
class A{
}
class MyHashSet<T>{
private HashMap<T,Object> hashmap;
public MyHashSet(){
hashmap = new HashMap<>();
}
public void add(T t){
hashmap.put(t,null);
}
public boolean remove(Object o){
return hashmap.remove(o)==null;
}
public int size(){
return hashmap.size();
}
}
可以发现,去删除一个不存在的key,返回的竟然也是true。
所以HashSet用对象类型作为value,来保证删除的key的value值都是不一样的,这样就可以保证上述remove方法返回的正确性!