Java集合--HashSet

概述

HashSet 实现了 Set 接口,是一个不包含重复元素的集合。通过源代码分析一下 HashSet 是如何做到元素不重复的。

继承关系

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

继承自 AbstractSet 抽象类,实现了 Set 接口

内部结构

private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

定义了一个全局的 HashMap<E, Object> 还有一个 PRESET 的全局的静态变量,初始化为一个空的 Object。

构造方法

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);
}

一共提供了4个构造方法,提供了一些不同的参数,主要是 new 出一个新的 HashMap,设置不同的容量和负载因子,由此可见 HashSet 的内部是通过 HashMap 实现的。

Add 方法

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

add 方法其实是调用的 map 的 put 方法,将对象作为 key,PRESET 常量作为 value,放入全局的 map。通过 HashMap 不能含有重复 key 的特性来完成 "HashSet 不能包含重复值的" 的功能。

remove / contains

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

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

都是直接调用的 HashMap 的方法。

总结

HashSet 的源码还是比较简单的。基本稍微看一下源代码都能看懂。

猜你喜欢

转载自my.oschina.net/u/232911/blog/2960885