一、簡介
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());
}
結果爲 :