1. 程式人生 > >Java 基礎學習筆記 —— 集合框架中的Set

Java 基礎學習筆記 —— 集合框架中的Set

引言

繼上篇文章講過了Java中的Map之後,接下來我們會關注另外一種集合型別——Set。

Set直譯就是集合的意思,代表中不存在重複元素的一個組合。這個定義與我們上篇文章要中介紹的Map中的key定義一致。在Map中,Key也是唯一的。所以Set也大多包含了Map

下面是Set的類圖

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中的方法直接進行實現的,其它方法也都是一樣。

小結

當我們瞭解了ListMap的結構後,再來看Set的實現就會輕鬆很多,因為Set實際上是基於List或是Map實現的。