JDK源碼分析之Set類(lèi)詳解
JDK源碼分析Set類(lèi),因?yàn)镾et類(lèi)是經(jīng)常要用到的,那我們知道JDK源碼中Set類(lèi)在其中不可以有相同的元素,那么判斷這個(gè)元素是否相同是如何實(shí)現(xiàn)的呢,我們看下下面這張圖:
對(duì)JDK源碼分析之Set類(lèi)在這張類(lèi)圖上,首先我們看見(jiàn)一個(gè)經(jīng)典模式的應(yīng)用,那就是適配器模式,我們把map接口的對(duì)象,包裝成為了Set的接口;在代碼中,我們來(lái)分析一下;
首先,我們看一下HashSet
- private transient HashMap
map; - // Dummy value to associate with an Object in the backing Map
- private static final Object PRESENT = new Object();
可見(jiàn),他適配了HashMap,那么他的功能是如何委托給HashMap結(jié)構(gòu)的呢?
- public boolean add(E e) {
- return map.put(e, PRESENT)==null;
- }
在HashMap中,我們大多數(shù)時(shí)候是用value,但是在set的時(shí)候,卻很好的利用了已有類(lèi)HashMap,他利用了HashMap的key的唯一性來(lái)保證存儲(chǔ)在Set中的元素的唯一性;
private static final Object PRESENT = new Object();
是這個(gè)HashMap所有key的value,他只是一個(gè)形式,而我們真正的數(shù)據(jù)是存在在key中的資源;
我們***拿到的迭代器也是:
- public Iterator
iterator() { - return map.keySet().iterator();
- }
Map的keySet的迭代器;
同理,我們看看LinkedhashMap;
- public LinkedHashSet(int initialCapacity, float loadFactor) {
- super(initialCapacity, loadFactor, true);
- }
- /**
- * Constructs a new, empty linked hash set with the specified initial
- * capacity and the default load factor (0.75).
- *
- * @param initialCapacity the initial capacity of the LinkedHashSet
- * @throws IllegalArgumentException if the initial capacity is less
- * than zero
- */
- public LinkedHashSet(int initialCapacity) {
- super(initialCapacity, .75f, true);
- }
- /**
- * Constructs a new, empty linked hash set with the default initial
- * capacity (16) and load factor (0.75).
- */
- public LinkedHashSet() {
- super(16, .75f, true);
- }
調(diào)用了父類(lèi)的構(gòu)造函數(shù);構(gòu)造函數(shù)如下:
- HashSet(int initialCapacity, float loadFactor, boolean dummy) {
- map = new LinkedHashMap
(initialCapacity, loadFactor); - }
生出了LinkedHashMap;
同理,我們一樣可見(jiàn)到TreeMap的實(shí)現(xiàn):
- private transient NavigableMap
m; - // Dummy value to associate with an Object in the backing Map
- private static final Object PRESENT = new Object();
更多的,我們也可以理解他是一種橋接模式的一種變形,不過(guò)我想從意義上,我更愿意相信其是適配器的應(yīng)用;
對(duì)JDK源碼分析之Set類(lèi)到這里,希望對(duì)你有幫助。
【編輯推薦】