HashSet
特点:不允许放入重复元素
查看源码,发现HashSet是基于HashMap来实现的,对HashMap做了一次“封装”。
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); //map的value
构造函数
//空的构造函数 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); }
基本操作
public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; } public boolean contains(Object o) { return map.containsKey(o); } public int size() { return map.size(); }
最佳实践:
1 HashSet底层就是HashMap,只要理解了 hashmap,HashSet自然就理解了。
2 HashSet中的数据不可重复
3 HashSet线程不安全
4 实际开发中,如果能够预料set的大小,建议优先使用带容量的构造器,好提高性能。
我的另一篇文章,JDK8集合类源码解析 - HashMap