JDK源碼-Set系列

Set*

/**
 * A collection that contains no duplicate elements.  More formally, sets
 * contain no pair of elements <code>e1</code> and <code>e2</code> such that
 * <code>e1.equals(e2)</code>, and at most one null element.  As implied by
 * its name, this interface models the mathematical <i>set</i> abstraction.
   Set是一個沒有重復元素的集合.在一個 Set 中,不能有兩個引用指向同一個對象,
或兩個指向 null 的引用梁剔。如果對象 a 和 b 的引用滿足條件 a.equals(b)筐带,那么這兩個
對象也不能同時出現(xiàn)在集合中。
該接口的大部分方法繼承于Collection.
 *
 * <p>The <tt>Set</tt> interface places additional stipulations, beyond those
 * inherited from the <tt>Collection</tt> interface, on the contracts of all
 * constructors and on the contracts of the <tt>add</tt>, <tt>equals</tt> and
 * <tt>hashCode</tt> methods.  Declarations for other inherited methods are
 * also included here for convenience.  (The specifications accompanying these
 * declarations have been tailored to the <tt>Set</tt> interface, but they do
 * not contain any additional stipulations.)
  Set除了繼承Collection接口的一些方法之后,具有很多一些其他的規(guī)定.
 *
 * <p>The additional stipulation on constructors is, not surprisingly,
 * that all constructors must create a set that contains no duplicate elements
 * (as defined above).
 *
 * <p>Note: Great care must be exercised if mutable objects are used as set
 * elements.  The behavior of a set is not specified if the value of an object
 * is changed in a manner that affects <tt>equals</tt> comparisons while the
 * object is an element in the set.  A special case of this prohibition is
 * that it is not permissible for a set to contain itself as an element.
 *
 * <p>Some set implementations have restrictions on the elements that
 * they may contain.  For example, some implementations prohibit null elements,
 * and some have restrictions on the types of their elements.  Attempting to
 * add an ineligible element throws an unchecked exception, typically
 * <tt>NullPointerException</tt> or <tt>ClassCastException</tt>.  Attempting
 * to query the presence of an ineligible element may throw an exception,
 * or it may simply return false; some implementations will exhibit the former
 * behavior and some will exhibit the latter.  More generally, attempting an
 * operation on an ineligible element whose completion would not result in
 * the insertion of an ineligible element into the set may throw an
 * exception or it may succeed, at the option of the implementation.
 * Such exceptions are marked as "optional" in the specification for this
 * interface.
 *
 * <p>This interface is a member of the
 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
 * Java Collections Framework</a>.
 *

類圖:

TreeSet實現(xiàn)
A NavigableSet implementation based on a TreeMap. The elements are ordered using their natural ordering, 
or by a Comparator provided at set creation time, depending on which constructor is used.This 
implementation provides guaranteed log(n) time cost for the basic operations (add, remove and contains).
  • TreeSet主要依賴于NavigableMap實現(xiàn),由于NavigableMap只是一個接口,因此底層依然是使用TreeMap來包含Set集合中的所有元素.TreeMap本身是有序的,所以TreeSet也是有序的.
/**
     * Constructs a new, empty tree set, sorted according to the
     * natural ordering of its elements.  All elements inserted into
     * the set must implement the {@link Comparable} interface.
     * Furthermore, all such elements must be <i>mutually
     * comparable</i>: {@code e1.compareTo(e2)} must not throw a
     * {@code ClassCastException} for any elements {@code e1} and
     * {@code e2} in the set.  If the user attempts to add an element
     * to the set that violates this constraint (for example, the user
     * attempts to add a string element to a set whose elements are
     * integers), the {@code add} call will throw a
     * {@code ClassCastException}.
     */
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
  • 添加元素時,通過在內(nèi)置的map添加一個<元素,PRESENT(dummy Obejct)>.
    /**
     * Adds the specified element to this set if it is not already present.
     * More formally, adds the specified element {@code e} to this set if
     * the set contains no element {@code e2} such that
     * <tt>(e==null ? e2==null : e.equals(e2))</tt>.
     * If this set already contains the element, the call leaves the set
     * unchanged and returns {@code false}.
     *
     * @param e element to be added to this set
     * @return {@code true} if this set did not already contain the specified
     *         element
     * @throws ClassCastException if the specified object cannot be compared
     *         with the elements currently in this set
     * @throws NullPointerException if the specified element is null
     *         and this set uses natural ordering, or its comparator
     *         does not permit null elements
     */
    public boolean add(E e) {
        return m.put(e, PRESENT)==null;
    }

HashSet

  • HashSet 實現(xiàn)了 Set 接口默怨,而 Set 接口是繼承于 Collection 接口幕庐,所以可以認為 Set 接口是 List 接口的兄弟久锥。

  • HashSet底層是通過HashMap實現(xiàn),所以他也是無序的.

  • 其實就是 HashSet 用了一個空對象,如 private static final Object PRESENT = new Object
    用這個空對象來填充 HashMap 的 value 域
    用這個空對象來填充 HashMap 的 value 域
    用這個空對象來填充 HashMap 的 value 域
    如下面的 add 方法:

private transient HashMap<E,Object> map;

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
  • so:從這里就可以看出:
    利用了 HashMap 實現(xiàn)异剥。HashSet 的方法就是調(diào)用 HashMap 的對應的方法瑟由。
    用空對象來填充 HashMap 的 value 域
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冤寿,隨后出現(xiàn)的幾起案子歹苦,更是在濱河造成了極大的恐慌,老刑警劉巖督怜,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殴瘦,死亡現(xiàn)場離奇詭異,居然都是意外死亡号杠,警方通過查閱死者的電腦和手機痴施,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辣吃,你說我怎么就攤上這事动遭。” “怎么了神得?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵厘惦,是天一觀的道長。 經(jīng)常有香客問我哩簿,道長宵蕉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任节榜,我火速辦了婚禮羡玛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宗苍。我一直安慰自己稼稿,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布讳窟。 她就那樣靜靜地躺著让歼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丽啡。 梳的紋絲不亂的頭發(fā)上谋右,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音补箍,去河邊找鬼改执。 笑死,一個胖子當著我的面吹牛坑雅,可吹牛的內(nèi)容都是我干的天梧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霞丧,長吁一口氣:“原來是場噩夢啊……” “哼呢岗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛹尝,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤后豫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后突那,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挫酿,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年愕难,在試婚紗的時候發(fā)現(xiàn)自己被綠了早龟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫霸。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葱弟,靈堂內(nèi)的尸體忽然破棺而出壹店,到底是詐尸還是另有隱情,我是刑警寧澤芝加,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布硅卢,位于F島的核電站,受9級特大地震影響藏杖,放射性物質(zhì)發(fā)生泄漏将塑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一蝌麸、第九天 我趴在偏房一處隱蔽的房頂上張望点寥。 院中可真熱鬧,春花似錦来吩、人聲如沸敢辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碾褂,卻和暖如春兽间,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背正塌。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工嘀略, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乓诽。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓帜羊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸠天。 傳聞我的和親對象是個殘疾皇子讼育,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一奶段、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,265評論 0 16
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法剥纷,內(nèi)部類的語法痹籍,繼承相關(guān)的語法,異常的語法晦鞋,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 從三月份找實習到現(xiàn)在蹲缠,面了一些公司棺克,掛了不少,但最終還是拿到小米线定、百度娜谊、阿里、京東渔肩、新浪因俐、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,253評論 11 349
  • 本篇文章帶你從Java源碼深入解析關(guān)于Java容器的概念澳眷。 參考文獻: Java容器相關(guān)知識全面總結(jié) Java官方...
    Tsy遠閱讀 19,786評論 13 142
  • 當社會沉痼或新奇的社會病钳踊,無人可以或愿意解決的時候,抱持社會關(guān)懷的任何組織勿侯,以企業(yè)所擁有的創(chuàng)新能力與創(chuàng)新精神拓瞪,可...
    心理師吳非閱讀 1,229評論 1 0