Java集合--HashSet
阿新 • • 發佈:2018-11-26
概述
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 的原始碼還是比較簡單的。基本稍微看一下原始碼都能看懂。