2019独角兽企业重金招聘Python工程师标准>>>
概述
HashSet 实现了 Set 接口,是一个不包含重复元素的集合。通过源代码分析一下 HashSet 是如何做到元素不重复的。
继承关系
public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable
继承自 AbstractSet 抽象类,实现了 Set 接口
内部结构
private transient HashMap map;
private static final Object PRESENT = new Object();
定义了一个全局的 HashMap
构造方法
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 的源码还是比较简单的。基本稍微看一下源代码都能看懂。