手寫代碼:HashSet

一、簡介

1、特點

Set容器特點:無序、不可重複。
無序指Set中的元素沒有索引,我們只能遍歷查找;
不可重複指不允許加入重複的元素。

2、底層實現:

HashSet是採用哈希算法實現,底層實際是用HashMap實現的(HashSet本質就是一個簡化版的(HashMap),因此,查詢效率和增刪效率都比較高;

在這裏插入圖片描述

查看底層代碼,我們發現裏面有個map屬性,這就是HashSet的核心祕密。我們再看add()方法,發現增加一個元素說白了就是在map中增加一個鍵值對,鍵對象就是這個元素,值對象是名爲PRESENT的Object對象。說白了,就是“往set中加入元素,本質就是把這個元素作爲key加入到了內部的map中”。

由於map中key都是不可重複的,因此,Set天然具有“不可重複”的特性。

二、代碼

手寫的代碼:

public class MyHashSet {
    HashMap map;
    private static final Object PRESENT = new Object();

    public MyHashSet() {
        map = new HashMap<>();
    }

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

    public void add(Object o) {
        map.put(o, PRESENT);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (Object key : map.keySet()) {
            sb.append(key + ",");
        }
        sb.setCharAt(sb.length() - 1, ']');
        return sb.toString();
    }

調用測試:

public static void main(String[] args) {
    MyHashSet set = new MyHashSet();
    set.add("10");
    set.add("30");
    set.add("20");
    System.out.println(set.size());
    System.out.println(set.toString());
}

結果爲 :
在這裏插入圖片描述

發佈了72 篇原創文章 · 獲贊 49 · 訪問量 6351
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章