HashSet源码解析
1、属性
//底层使用了HashMap来存储元素,所以元素不可能出现重复 private transient HashMap<E,Object> map; //用来填充底层数据结构HashMap中的value,因为HashSet只用key存储数据。 private static final Object PRESENT = new Object();
2、构造器
//无参构造 public HashSet() { map = new HashMap<>(); }
public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); }
public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); }
public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) modified = true; return modified; }
最后这个构造方法,与前面那个有所不同,因为它是由LinkedHashSet实现的。
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
添加和删除都是HashMap中的操作,而想遍历元素的话,就需要使用迭代器依次遍历:
3、添加
public boolean add(E e) { return map.put(e, PRESENT)==null; }
4、删除
public boolean remove(Object o) { return map.remove(o)==PRESENT; }
注意:HashSet中的元素存储是无序的,因为是根据hash值来存储。