Java原始碼系列 -- HashSet
一、類簽名
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
二、資料成員
HashSet利用HahsMap來實現集合的特性。利用HahsMap儲存key的雜湊值去重,如果鍵key對應的值部非空,表明這個key存在。
private transient HashMap<E,Object> map;
一個常量物件,在HahsMap的value中起到佔位的作用。
private static final Object PRESENT = new Object();
三、構造方法
構造全新的、空的集合,利用HashMap例項來實現,初始化大小為16,負載因子0.75
public HashSet() {
map = new HashMap<>();
}
利用給定集合包含的元素來構造新的集合,HashMap例項初始化大小為16,負載因子0.75
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
通過指定大小的容量值和負載因子來初始化一個內部HashMap.
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
通過指定大小的容量值來初始化一個內部HashMap,負載因子預設值為0.75
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
這個建構函式使用LinkedHashMap,構造引數多了一個無用的布林值,用於區分上面的構造方法。LinkedHashMap實現的HashMap是有序的。
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
四、成員方法
返回一個迭代器,迭代器指示的元素沒有固定順序。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
返回集合中包含元素的數量。
public int size() {
return map.size();
}
如果容器中沒有任何元素,返回true。
public boolean isEmpty() {
return map.isEmpty();
}
檢查集合中是否包含指定元素。
public boolean contains(Object o) {
return map.containsKey(o);
}
若集合不包含該元素e,成功插入返回true。集合中已包含指定元素,則原集合不會改變,並返回false。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
從集合中移除指定元素
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
清空集合中所有元素
public void clear() {
map.clear();
}
相關文章
- Java集合原始碼分析(九)——HashSetJava原始碼
- Java集合系列-HashSetJava
- Java集合原始碼學習(4)HashSetJava原始碼
- HashSet原始碼分析原始碼
- HashSet原始碼解析原始碼
- Java集合框架原始碼剖析:HashSet 和 HashMapJava框架原始碼HashMap
- Java 集合框架 HashSet 和 HashMap 原始碼剖析Java框架HashMap原始碼
- Java容器類框架分析(5)HashSet原始碼分析Java框架原始碼
- Java類集框架 —— HashSet、LinkedHashSet原始碼分析Java框架原始碼
- java基礎:HashSet/LinkedHashSet/TreeSet — 原始碼分析Java原始碼
- HashSet原始碼詳解原始碼
- Java面試題 從原始碼角度分析HashSet實現原理?Java面試題原始碼
- 原始碼分析–HashSet(JDK1.8)原始碼JDK
- 站在巨人肩膀上看原始碼-HashSet原始碼
- HashSet 新增/遍歷元素原始碼分析原始碼
- Java容器系列-LinkedList 原始碼分析Java原始碼
- Java 集合系列:Vector原始碼深入解析Java原始碼
- 集合框架-HashSet集合的add()方法的原始碼框架原始碼
- Java 集合系列之 LinkedList原始碼分析Java原始碼
- 【集合框架】JDK1.8原始碼分析HashSet && LinkedHashSet(八)框架JDK原始碼
- Java併發包原始碼學習系列:同步元件CountDownLatch原始碼解析Java原始碼元件CountDownLatch
- Java併發包原始碼學習系列:同步元件CyclicBarrier原始碼解析Java原始碼元件
- Java併發包原始碼學習系列:同步元件Semaphore原始碼解析Java原始碼元件
- Java 容器系列(六):LinkedList 原始碼分析02Java原始碼
- 搞懂 HashSet & LinkedHashSet 原始碼以及集合常見面試題目原始碼面試題
- Java結合中的HashSetJava
- HashTable HashMap HashSet區別(java)HashMapJava
- Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及區別Java
- Flutter 原始碼系列:DropdownButton 原始碼淺析Flutter原始碼
- Spring原始碼系列:BeanDefinition原始碼解析Spring原始碼Bean
- Java併發包原始碼學習系列:執行緒池ThreadPoolExecutor原始碼解析Java原始碼執行緒thread
- Java併發包原始碼學習系列:執行緒池ScheduledThreadPoolExecutor原始碼解析Java原始碼執行緒thread
- Java併發包原始碼學習系列:JDK1.8的ConcurrentHashMap原始碼解析Java原始碼JDKHashMap
- Java集合(5)一 HashMap與HashSetJavaHashMap
- Spark 原始碼分析系列Spark原始碼
- Handler系列原始碼解析原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- vuex 原始碼:原始碼系列解讀總結Vue原始碼