Java 基礎學習筆記 —— 集合框架中的Set
阿新 • • 發佈:2019-01-07
引言
繼上篇文章講過了Java中的Map之後,接下來我們會關注另外一種集合型別——Set。
Set
直譯就是集合的意思,代表中不存在重複元素的一個組合。這個定義與我們上篇文章要中介紹的Map
中的key
定義一致。在Map
中,Key
也是唯一的。所以Set
也大多包含了Map
。
下面是Set
的類圖
從類圖我們也能夠看出來,Set
的具體實現也從是否支援併發、是否支援排序進行了分化。
具體實現
由於Set
中許多類都是基於Map
的,在下面列出部分直接的對應關係,就不做具體介紹了。
Set | Map | 備註 |
---|---|---|
HashSet | HashMap | 非執行緒安全 |
LinkedHashSet | LinkedHashMap | 非執行緒安全 |
ConcurrentSkipListSet | ConcurrentSkipListMap | 執行緒安全 |
TreeSet | TreeMap | 非執行緒安全 |
以上,就是兩者之間的對應關係,實際上這些Set
中都包含了對應Map
作為成員變數,而Set
中的元素,就對應Map
中的key。
而唯一的一個例外,就是CopyOnWriteArraySet
。這是基於CopyOnWriteArrayList
實現的集合。
首先,看一下其成員變數
public class CopyOnWriteArraySet<E> extends AbstractSet<E>
implements java.io.Serializable {
private static final long serialVersionUID = 5457747651344034263L;
//CopyOnWriteArrayList作為成員變數
private final CopyOnWriteArrayList<E> al;
}
其次,就是add
方法
public boolean add(E e) {
//這裡的新增,copyOnWriteArrayList會首先複製生成一個SNAPSHOT,然後在SNAPSHOT中進行新增,最後將舊的指標指向SNAPSHOT
return al.addIfAbsent(e);
}
可以看到,其實都是直接呼叫了CopyOnWriteArrayList
中的方法直接進行實現的,其它方法也都是一樣。
小結
當我們瞭解了List
,Map
的結構後,再來看Set
的實現就會輕鬆很多,因為Set
實際上是基於List
或是Map
實現的。