java集合(5):HashSet原始碼分析
阿新 • • 發佈:2019-01-09
前言
HashSet實現 Set 介面,由雜湊表(實際上是一個 HashMap 例項)支援。它不保證 set的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。Set集合取出元素的方式只有一個,那就是迭代器。
Set介面中的方法與Collection介面中的方法相同。
- HashSet底層依賴於HashMap,關於HashMap原始碼詳解見:HashMap原始碼詳解
正文
HashSet的原始碼分析
1,類名及類成員變數
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
// 底層使用HashMap來組織元素
private transient HashMap<E,Object> map;
// PRESENT作為靜態常量,用來填充HashMap的value
private static final Object PRESENT = new Object();
}
2,HashSet類構造方法
// 1,預設無參構造方法,構造一個空的HashSet,初始容量16,載入因子0.75
public HashSet() {
map = new HashMap<>();
}
// 2,構造指定容量的空HashSet
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
// 3,構造指定容量和載入因子的空HashSet
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
// 4,內部構造方法,不對外開放。對LinkedHashSet的支援
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
// 5,構造一個包含指定集合的HashSet
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
3,HashSet類常用方法
// add()呼叫map的put()方法,value用PRESENT常量填充
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
// size()呼叫map的size()方法
public int size() {
return map.size();
}
// iterator()呼叫map的迭代器方法
public Iterator<E> iterator() {
return map.keySet().iterator();
}
總結
HashSet完全依賴於HashMap,所以要好好理解HashMap的實現原理。