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幫助我們理解底層實現,有些細節還未考慮,只是方便理解。本文僅供大家學習參考,共同學習,共同進步。