特点:
如果对HashMap理解不深,请先查阅 HashMap源码详解 ,否则会对本片博客理解有一定困难;
底层数据结构:HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value;所以HashSet和HashMap的所具有的特点是类似的;
默认值:与HashMap相同;
基本属性:
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
继承关系:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>,
Cloneable,
java.io.Serializable
构造函数:均调了HashMap对应的构造函数
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
CRUD(增删改查):
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
HashSet应用场景:去重
ArrayList<Integer> arrayList=new ArrayList<>(100000);
for (int i = 0; i <100000 ; i++) {
arrayList.add((int) (Math.random()*1000));
}
iterator=arrayList.iterator();
HashSet<Integer> hashSet1=new HashSet<>();
while(iterator.hasNext()){
Integer val= iterator.next();
if(hashSet1.add(val)){
System.out.println(val);
}
}