HashSet线程不安全,底层是HashMap,add的值是map的key,value源码里写着是object类的PRESENT,value是不变的。
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
//增加的元素放到map中的key,而value放的是一个Object,所以value是不变的
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashSet集合特点是不重复,底层HashMap,key保存的就是元素,你传进来直接覆盖,如果重复会找到key相同的覆盖,所以HashSet里面就不会有同样的key
CopyOnWriteArraySet解决安全问题,底层还是CopyOnWriteArrayList
private final CopyOnWriteArrayList<E> al;
/**
* Creates an empty set.
*/
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
所以重点关注Map集合吧