1. 程式人生 > >Java集合Collection之實現原理解讀(HashSet)

Java集合Collection之實現原理解讀(HashSet)

一、簡介

HashSet實現Set介面,底層是由雜湊表實現(實際上是HashMap),Set裡面的元素無序不重複,可以允許null值。對於熟悉HashMap底層實現的同學相信很容易理解HashSet底層實現原理。

二、實現原理

HashSet底層是通過HashMap實現的,通過HashMap來儲存所有的元素,HashSet對資料的操作基本上都是呼叫HashMap的一些方法進行操作,所以不會特別複雜。HashSet中的值底層都是作為HashMap中的鍵key中,值都是統一的一個常量,HashSet中的元素不允許重複,其實就是利用了HashMap的鍵不可重複性。

三、自定義HashSet

package com.wsh;

import java.util.HashMap;

/**
 * @Description: 自定義HashSet, 幫助理解set底層實現
 * @Auther: weishihuai
 * @Date: 2018/10/1 20:55
 * <p>
 * 說明:
 * 1.Set底層是通過Map來實現的,Set的值作為Map中鍵
 * 2.Set中一些操作方法都是針對Map來操作
 * 3.Set不可重複就是利用map的鍵不可重複特性
 */
public class CustomSet {

    private HashMap map;
    private static final Object PRESENT = new Object();
    private int size;

    /**
     * 構造方法:建立一個Map結構用於儲存Set
     */
    public CustomSet() {
        map = new HashMap<>();
    }

    /**
     * 往Set中新增元素
     * 原理: 物件作為Map中的鍵進行儲存
     *
     * @param object 物件
     */
    public void add(Object object) {
        //Set不可重複就是利用Map的鍵不可重複特性
        map.put(object, PRESENT);
        size++;
    }

    /**
     * 返回Set中元素的個數
     *
     * @return Set中元素的個數
     */
    public int size() {
        return map.size();

    }

    /**
     * 判斷Set是否為空
     *
     * @return 是否為空標誌
     */
    public boolean isEmpty() {
        return map.isEmpty();
    }

    /**
     * 判斷Set中是否包含某個物件
     * 原理: 實際上是呼叫的Map中containsKey()判斷是否包含指定key元素的方法
     *
     * @param object 物件
     * @return
     */
    public boolean contains(Object object) {
        return map.containsKey(object);
    }

    /**
     * 移出Set中指定的物件
     * 原理: 實際上是呼叫的Map中移除元素的方法
     *
     * @param object 物件
     */
    public void remove(Object object) {
        map.remove(object);
    }
}

四、部分方法詳解

【a】add(Object object) {}        往Set中插入元素

1. 實現原理: 實際上呼叫Map.put(Object key, Object value)方法存放在HashMap中,Set的值作為map的鍵,值都是 統一的。

private static final Object PRESENT = new Object();

【b】 contains(Object object) {}       判斷Set中是否含有某個值

1. 實現原理: 依據set的值存放在map的鍵,實際上呼叫的是map.containsKey(Object key)判斷map中是否存放指定key的元素。

【c】remove(Object object){}        刪除Set中指定的元素

1. 實現原理:實際上呼叫map.remove(Object object)移除元素的方法。

【d】isEmpty() {}   判斷set是否為空

1. 實現原理: 實際上只需要判斷map是否為空即可。

可以看到,set中的很多方法實際上呼叫的是map操作資料的方法。

五、測試

package com.wsh;


/**
 * @Description: 測試
 * @Auther: weishihuai
 * @Date: 2018/10/1 21:11
 */
public class TestCustomSet {

    public static void main(String[] args) {
        CustomSet customSet = new CustomSet();

        customSet.add("aaa");
        customSet.add(new String("aaa"));
        //1
        System.out.println(customSet.size());
        //false
        System.out.println(customSet.isEmpty());

        customSet.add("bbb");
        customSet.remove("aaa");
        //1
        System.out.println(customSet.size());
        //true
        System.out.println(customSet.contains("bbb"));
    }

}

六、總結

Set底層是通過HashMap雜湊表實現,Set的值作為HashMap的鍵儲存,值統一用了一個指定的常量,Set中的元素不可以重複,也是無序的,Set不可重複就是利用了Map中的鍵不可重複性。以上就是有關HashSet的簡單理解,以及實現了一個自定義HashSet幫助我們理解底層實現,有些細節還未考慮,只是方便理解。本文僅供大家學習參考,共同學習,共同進步。