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

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

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

    JDK源碼分析之Set類(lèi)詳解

      JDK源碼分析Set類(lèi),因?yàn)镾et類(lèi)是經(jīng)常要用到的,那我們知道JDK源碼中Set類(lèi)在其中不可以有相同的元素,那么判斷這個(gè)元素是否相同是如何實(shí)現(xiàn)的呢,我們看下下面這張圖:

      JDK源碼分析之Set類(lèi)圖  

      對(duì)JDK源碼分析之Set類(lèi)在這張類(lèi)圖上,首先我們看見(jiàn)一個(gè)經(jīng)典模式的應(yīng)用,那就是適配器模式,我們把map接口的對(duì)象,包裝成為了Set的接口;在代碼中,我們來(lái)分析一下;

      首先,我們看一下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(); 

      可見(jiàn),他適配了HashMap,那么他的功能是如何委托給HashMap結(jié)構(gòu)的呢?

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

      在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中的資源;

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

          
      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.    } 

      調(diào)用了父類(lèi)的構(gòu)造函數(shù);構(gòu)造函數(shù)如下:

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

      生出了LinkedHashMap;

      同理,我們一樣可見(jiàn)到TreeMap的實(shí)現(xiàn):

          
      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(); 

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

      對(duì)JDK源碼分析之Set類(lèi)到這里,希望對(duì)你有幫助。

    posted on 2010-02-05 14:28 鍵盤(pán)動(dòng)物 閱讀(284) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2010年2月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28123456
    78910111213

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆檔案

    新聞分類(lèi)

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费看少妇高潮成人片| 免费v片在线观看视频网站| 99久久久精品免费观看国产 | 国产精品久免费的黄网站| 国产亚洲AV夜间福利香蕉149 | 亚洲AV无码AV男人的天堂不卡| 国产一级a毛一级a看免费视频 | 免费国产作爱视频网站| 亚洲精品网站在线观看不卡无广告 | 亚洲乱码国产一区网址| 亚洲成AV人片久久| 一个人看的免费高清视频日本| 国产精品怡红院永久免费| 久久夜色精品国产亚洲av| 亚洲区视频在线观看| 中文字幕成人免费高清在线视频| 一本无码人妻在中文字幕免费| 国产亚洲精品激情都市| 亚洲AV无码专区国产乱码不卡| 久久久99精品免费观看| 亚洲高清无码综合性爱视频| 亚洲二区在线视频| 十八禁在线观看视频播放免费| 香蕉视频在线观看免费国产婷婷| 亚洲91av视频| caoporm超免费公开视频| 好男人看视频免费2019中文| 中文字幕亚洲综合久久| 国产免费MV大全视频网站| 午夜免费福利在线观看| 亚洲欧洲校园自拍都市| a级片在线免费看| 亚洲国产日韩成人综合天堂| 亚洲一区AV无码少妇电影| 99久久久国产精品免费蜜臀| 久久精品国产亚洲7777| 婷婷亚洲综合一区二区| 毛片免费视频观看| 亚洲综合久久1区2区3区| 国产va在线观看免费| 亚洲日韩v无码中文字幕|