1. 程式人生 > >Java集合--HashSet

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 的原始碼還是比較簡單的。基本稍微看一下原始碼都能看懂。