HashSet類(lèi)如何實(shí)現(xiàn)元素不重復(fù)

根據(jù)源碼:
HashSet類(lèi)中的add()方法:

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

put()方法:

 public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

原理:如果set中的元素與傳入值重復(fù),則不再添加進(jìn)去缠沈。
可以看到错蝴,關(guān)于重復(fù)的定義:

  1. 如果hash碼值不相同,說(shuō)明是一個(gè)新元素顷锰,存;
  2. 如果hash碼值相同肛宋,則繼續(xù)判斷equles:
    • 如果hash碼值相同,且equles判斷相等酝陈,說(shuō)明元素已經(jīng)存在毁涉,不存;
    • 如果hash碼值相同,且equles判斷不相等馅精,說(shuō)明元素不存在粱檀,存;

所以關(guān)鍵是兩個(gè)方法:hashCode()和equles()

hash:
hash算法計(jì)算出的結(jié)果就是hash碼值茄蚯;
hash算法的計(jì)算方式:
通過(guò)對(duì)象中的成員來(lái)計(jì)算出來(lái)的結(jié)果;
如果成員變量是基本數(shù)據(jù)類(lèi)型的值壮不, 那么用這個(gè)值直接參與計(jì)算;
如果成員變量是引用數(shù)據(jù)類(lèi)型的值询一,那么獲取到這個(gè)成員變量的hash碼值后癌椿,再參數(shù)計(jì)算

例如新建一個(gè)Student對(duì)象,如果需要用HashSet集合對(duì)其進(jìn)行管理踢俄,那么需要重寫(xiě)hashCode()equals()

class Student{
    private String name;
    public Student(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    @Override
    public int hashCode() {
        return this.name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student){
            Student student = (Student) obj;
            return this.name.equals(student.getName());
        }
        return super.equals(obj);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末都办,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子琳钉,更是在濱河造成了極大的恐慌,老刑警劉巖跟压,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歼培,死亡現(xiàn)場(chǎng)離奇詭異茸塞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钾虐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)效扫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)直砂,“玉大人浩习,你說(shuō)我怎么就攤上這事∑谆啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵郊供,是天一觀(guān)的道長(zhǎng)近哟。 經(jīng)常有香客問(wèn)我驮审,道長(zhǎng)吉执,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任峡竣,我火速辦了婚禮量九,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荠列。我一直安慰自己,他們只是感情好费就,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布川队。 她就那樣靜靜地躺著,像睡著了一般固额。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逝慧,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音云稚,去河邊找鬼。 笑死静陈,一個(gè)胖子當(dāng)著我的面吹牛踱蛀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播率拒,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼角撞!你這毒婦竟也來(lái)了勃痴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沛申,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后尖淘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體著觉,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年趁桃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肄鸽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡典徘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤罕模,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布帘瞭,位于F島的核電站,受9級(jí)特大地震影響蝶念,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媒殉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一廷蓉、第九天 我趴在偏房一處隱蔽的房頂上張望全封。 院中可真熱鬧桃犬,春花似錦、人聲如沸攒暇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尾序。三九已至,卻和暖如春每币,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梦鉴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工揭保, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秸侣。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓宠互,卻偏偏與公主長(zhǎng)得像椭坚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子善茎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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