<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 鍵盤動物 閱讀(284) 評論(0)  編輯  收藏


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


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

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    新聞分類

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产精品亚洲综合| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲一区二区免费视频| 国外成人免费高清激情视频| 七次郎成人免费线路视频| 无码乱人伦一区二区亚洲| 大学生一级特黄的免费大片视频| 精品在线视频免费| 亚洲综合色丁香麻豆| 又黄又大又爽免费视频| 国产精品免费一区二区三区四区| 亚洲熟女精品中文字幕| 亚洲情XO亚洲色XO无码| 在线不卡免费视频| 日韩精品无码免费专区午夜不卡| 亚洲愉拍一区二区三区| 国产亚洲精品资源在线26u| 四色在线精品免费观看| 18禁超污无遮挡无码免费网站| 亚洲精品伦理熟女国产一区二区 | 最新亚洲人成无码网www电影| 亚洲成在人线av| 免费a级黄色毛片| 在线观看免费高清视频| 国产午夜无码片免费| 99亚洲精品卡2卡三卡4卡2卡| 18gay台湾男同亚洲男同| 亚洲日韩精品一区二区三区 | 久久av免费天堂小草播放| 亚洲色成人四虎在线观看| 亚洲av女电影网| 亚洲午夜久久久影院| 国产精品无码一二区免费| 国产免费AV片在线播放唯爱网 | 色吊丝最新永久免费观看网站 | 日韩电影免费在线观看视频| 在线观看的免费网站无遮挡 | vvvv99日韩精品亚洲| 成年女人毛片免费观看97| 亚欧人成精品免费观看| 国内少妇偷人精品视频免费|