Java

Java HashSet源码分析(JDK 1.8)

2019-03-20  本文已影响4人  小怪兽大作战

首先看一下HashSet的继承关系。


未命名文件.png

HashSet实现了set接口,内部使允许有重复的值。

成员变量

private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

可以看到HashSet内部有两个成员变量,HashMap和Object。

构造方法

  public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

HashSet的构造方法都创建了HashMap对象。

add(Object o)

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

在HashSet的add方法中直接调用了map的put方法,key值就是我们添加的对象,value值是成员变量,也就是一个Object对象。
因此,HashSet内部是使用HashMap来实现的,存放的key就是我们添加的对象,存放的value就是一个Object对象。

remove(Object o)

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

contains(Object o)

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

其他方法都是基于HashMap来实现的,就不多说了。
总结:HashSet内部有一个HashMap,每放入一个A,就在内部的HashMap中放入这样一个结点:他的key是需要放入的对象,value是一个Object类型的成员变量。

上一篇下一篇

猜你喜欢

热点阅读