1、HashSet介紹
與HashMap類似,字面上看,HashSet由兩個單詞組成:
Hash
和Set
。其中,Set
表示接口,實現Set
接口也有多種方式,各有特點,HashSet實現的方式利用了HashSet
public interface Set<E> extends Collection<E> {
表示容器
沒有重複元素、且不保證順序
的容器接口,它擴展了Collection
,但沒有定義任何新的方法、
無順序,不重複
與`HashMap類似,HashSet要求元素重寫hashCode和equals方法,且對於兩個對象,如果equals相同,則hashCode也必須相同,如果是自定義的類,需要注意這一點
HashSet的應用場景
- 排重
- 保存特殊值
- 集合運算
底層就是一個HashMap
2、構造函數
HashSet的內部是用HashMap實現的,它內部有一個HashMap實例變量
同時,這個HashMap所有鍵對應的值固定
//HashSet內部使用HashMap實現,它的內部有一個HashMap實例變量
private transient HashMap<E,Object> map;
//Map有鍵和值,HashSet相當於只有鍵,都是相同的固定值,
private static final Object PRESENT = new Object();
HashSet的構造方法,主要就是調用了對應的HashMap的構造方法
2.1、HashSet
public HashSet() {
map = new HashMap<>();
}
2.2public HashSet(int initialCapacity, float loadFactor) {
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
2.3、public HashSet(int initialCapacity) {
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
2.4、 public HashSet(Collection<? extends E> c) {
public HashSet(Collection<? extends E> c) {
// c.size()/0.75用於計算initialCapacity,0.75f是loadFactor的默認值
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
//添加元素
addAll(c);
}
3、add方法
public boolean add(E e) {
//就是map調用的put元素,元素e用於鍵,值就是固定的PRESENT,
// put返回null表示原來沒有對應的鍵,添加成功了。
return map.put(e, PRESENT)==null;
}
4、remove方法
public boolean remove(Object o) {
//就是調用map的remove方法,返回值爲PRESENT表示原來有對應的鍵且刪除成功
return map.remove(o)==PRESENT;
}
5、contains
public boolean contains(Object o) {
//就是檢查map中是否包含對應的鍵
return map.containsKey(o);
}