JDK源碼分析之Set類詳解

            JDK源碼分析Set類,因為Set類是經常要用到的,那我們知道JDK源碼中Set類在其中不可以有相同的元素,那么判斷這個元素是否相同是如何實現的呢,我們看下下面這張圖:

            JDK源碼分析之Set類圖  

            對JDK源碼分析之Set類在這張類圖上,首先我們看見一個經典模式的應用,那就是適配器模式,我們把map接口的對象,包裝成為了Set的接口;在代碼中,我們來分析一下;

            首先,我們看一下HashSet

                
            1. private transient HashMap map;  
            2.  
            3.    // Dummy value to associate with an Object in the backing Map  
            4.    private static final Object PRESENT = new Object(); 

            可見,他適配了HashMap,那么他的功能是如何委托給HashMap結構的呢?

                
            1. public boolean add(E e) {  
            2.    return map.put(e, PRESENT)==null;  
            3.    } 

            在HashMap中,我們大多數時候是用value,但是在set的時候,卻很好的利用了已有類HashMap,他利用了HashMap的key的唯一性來保證存儲在Set中的元素的唯一性;

            private static final Object PRESENT = new Object();

            是這個HashMap所有key的value,他只是一個形式,而我們真正的數據是存在在key中的資源;

            我們最后拿到的迭代器也是:

                
            1. public Iterator iterator() {  
            2.   return map.keySet().iterator();  
            3.   } 

            Map的keySet的迭代器;

            同理,我們看看LinkedhashMap;

                
            1. public LinkedHashSet(int initialCapacity, float loadFactor) {  
            2.        super(initialCapacity, loadFactor, true);  
            3.    }  
            4.  
            5.    /**  
            6.     * Constructs a new, empty linked hash set with the specified initial  
            7.     * capacity and the default load factor (0.75).  
            8.     *  
            9.     * @param   initialCapacity   the initial capacity of the LinkedHashSet  
            10.     * @throws  IllegalArgumentException if the initial capacity is less  
            11.     *              than zero  
            12.     */ 
            13.    public LinkedHashSet(int initialCapacity) {  
            14.        super(initialCapacity, .75f, true);  
            15.    }  
            16.  
            17.    /**  
            18.     * Constructs a new, empty linked hash set with the default initial  
            19.     * capacity (16) and load factor (0.75).  
            20.     */ 
            21.    public LinkedHashSet() {  
            22.        super(16, .75f, true);  
            23.    } 

            調用了父類的構造函數;構造函數如下:

                
            1. HashSet(int initialCapacity, float loadFactor, boolean dummy) {  
            2.  map = new LinkedHashMap(initialCapacity, loadFactor);  
            3.  } 

            生出了LinkedHashMap;

            同理,我們一樣可見到TreeMap的實現:

                
            1. private transient NavigableMap m;  
            2.  
            3. // Dummy value to associate with an Object in the backing Map  
            4. private static final Object PRESENT = new Object(); 

            更多的,我們也可以理解他是一種橋接模式的一種變形,不過我想從意義上,我更愿意相信其是適配器的應用;

            對JDK源碼分析之Set類到這里,希望對你有幫助。

          posted on 2010-02-05 14:28 鍵盤動物 閱讀(287) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2010年2月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28123456
          78910111213

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          新聞分類

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 华池县| 泸定县| 虎林市| 紫金县| 广汉市| 杂多县| 高清| 南充市| 西丰县| 澎湖县| 太康县| 海口市| 白沙| 北辰区| 金湖县| 南靖县| 儋州市| 上杭县| 台山市| 祁门县| 宜黄县| 龙井市| 富源县| 中方县| 泗洪县| 巩留县| 水城县| 正阳县| 江源县| 衡东县| 安溪县| 马边| 缙云县| 崇信县| 马鞍山市| 开远市| 麻江县| 巴彦淖尔市| 定结县| 台安县| 鹿邑县|