Java集合--HashSet

概述

HashSet 實現了 Set 接口,是一個不包含重複元素的集合。經過源代碼分析一下 HashSet 是如何作到元素不重複的。java

繼承關係

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

繼承自 AbstractSet 抽象類,實現了 Set 接口spa

內部結構

private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();

定義了一個全局的 HashMap<E, Object> 還有一個 PRESET 的全局的靜態變量,初始化爲一個空的 Object。code

構造方法

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 的源碼仍是比較簡單的。基本稍微看一下源代碼都能看懂。ci

相關文章
相關標籤/搜索