HashSet實(shí)現(xiàn)原理

HashMap的實(shí)現(xiàn)原理中,詳細(xì)地介紹了HashMap的實(shí)現(xiàn)。那么你可能會(huì)問:這跟HashSet有什么關(guān)系?

HashSet簡(jiǎn)述

HashSet中不允許有重復(fù)元素,這是因?yàn)?strong>HashSet是基于HashMap實(shí)現(xiàn)的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是統(tǒng)一的一個(gè)private static final Object PRESENT = new Object();。HashSet跟HashMap一樣,都是一個(gè)存放鏈表的數(shù)組。

現(xiàn)在知道了二者的關(guān)系了,我們分析一下HashSet的源碼:

HashSet的構(gòu)造

對(duì)于HashSet而言,它是基于HashMap實(shí)現(xiàn)的,HashSet底層使用HashMap來保存所有元素,更確切的說,HashSet中的元素,只是存放在了底層HashMap的key上, 而value使用一個(gè)static final的Object對(duì)象標(biāo)識(shí)。因此HashSet 的實(shí)現(xiàn)比較簡(jiǎn)單,相關(guān)HashSet的操作,基本上都是直接調(diào)用底層HashMap的相關(guān)方法來完成

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;
    private static final Object PRESENT = new 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);
    }

    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
    ... ...
}

通過源碼,很容易地看出來HashSet是由HashMap構(gòu)造而成。

HashSet操作

   public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

    public int size() {
        return map.size();
    }

    public boolean isEmpty() {
        return map.isEmpty();
    }

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

    public void clear() {
        map.clear();
    }

HashSet的操作基本上都是由HashMap來實(shí)現(xiàn)的。

總結(jié)

HashSet底層由HashMap實(shí)現(xiàn)
HashSet的值存放于HashMap的key上
HashMap的value統(tǒng)一為PRESENT

參考

JDK API:HashSet

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,443評(píng)論 0 16
  • 本文將深入討論HashSet實(shí)現(xiàn)原理的源碼細(xì)節(jié)。在分析源碼之前,首先我們需要對(duì)HashSet有一個(gè)基本的理解。 H...
    六尺帳篷閱讀 1,555評(píng)論 0 9
  • 實(shí)際上,HashSet 和 HashMap 之間有很多相似之處,對(duì)于 HashSet 而言,系統(tǒng)采用 Hash 算...
    曹振華閱讀 2,561評(píng)論 1 37
  • 優(yōu)先選擇 hbuilder是國(guó)產(chǎn)的一款前端開發(fā)工具而且是免費(fèi)的,對(duì)于英語不好的前端工程師是一個(gè)不錯(cuò)的消息。hbui...
    開掛一波流閱讀 565評(píng)論 0 2
  • 這些天一直在下雨,我窩在樓房里,在書里感受春天,在蔣勛老師的字里行間感受春天。 老師不愧是學(xué)美術(shù)出身。在他...
    海的微語閱讀 661評(píng)論 0 2

友情鏈接更多精彩內(nèi)容