Java集合-10丨HashSet

Posted by jiefang on December 14, 2019

HashSet

简介

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the nullelement.

翻译:

此类实现Set接口,支持由哈希表(实际上是一个HashMap实例)。 它不保证为向集合的迭代顺序; 特别是,它不保证该顺序恒久不变。 此类允许null元素。

HashSet是由HashMap实现的不包含重复元素的集合。

类图

image

源码

属性

1
2
3
4
    //内部使用HashMap
    private transient HashMap<E,Object> map;
    //作为value
    private static final Object PRESENT = new Object();

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    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
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }    

添加

直接调用HashMap的put()方法,把元素本身作为key,把PRESENT作为value,也就是这个map中所有的value都是一样的。

1
2
3
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

删除

删除元素,删除成功返回true,否则false。

1
2
3
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

查询

检查元素是否存在。

1
2
3
4
    public boolean contains(Object o) {
        return map.containsKey(o);
    }
    

遍历

返回map的keySet。

1
2
3
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

总结

  1. HashSet内部使用HashMap的key存储元素,以此来保证key不重复;
  2. HashSet是无序的,因为HashMap的key是无序的;
  3. HashSet中允许有一个null元素,因为HashMap允许key为null;
  4. 非线程安全;
  5. 没有get()方法;