Set接口的實現類
HashSet與LinkedHashSet
HashSet與LinkedHashSet的關係就如同HashMap和LinkedHashMap同樣。HashSet內部保存了一個HashMap對象來存儲。java

利用Map對象,存入Map的k-v中value對象始終是同一個對象(就是上圖中聲明的private static final Object PRESENT = new Object()
對象)。從而Set只須要關心key對象便可。併發

- 很顯然,Set存儲的key集合是無序的。默認大小就是hashmap的默認大小16。每一次擴容也是2的倍數遞增。
- 上面的第2張圖示HashSet的構造方法之一,能夠看到是生成了一個LinkedHashMap,下面的LinkedHashSet就是調用這個構造方法來生成的。

LinkedHashSet則是繼承自HashSet,而且在生成的時候,調用了父類HashSet的對應的方法,從而維護了一個LinkedHashMap對象,就實現了元素有序。spa
- 上圖能夠看到,LinkedHashSet構造方法都是調用了父類中含有dummy參數的那一個構造方法(也就是維護LinkedHashMap的那一個!)
TreeSet
顯然,TreeSet內部也是維護了TreeMap來存儲元素。只保存key,而value值都是同一個Object對象。code

- Set對於的併發類有:java.util.concurrent.CopyOnWriteArraySet類和Collections.synchronizedSet(Set set)所修飾的類。
- 這2個併發類的區別和List對應的併發類的區別是一致的。前者是寫時複製,只保證數據最終的一致性,而不保證數據實時的一致性。後者藉助synchronized關鍵字修飾代碼塊,儘可能減少了鎖的粒度。
Set類圖
