HashSet如何確保元素不重復(fù)?

  • 1.HashSet原理:
  • 當(dāng)我們使用Set集合都是需要去掉重復(fù)元素的,如果在存儲的時候逐個equals()比較,效率較低,哈希算法
  • 提高類去重復(fù)的效率,降低了equals()的使用次數(shù)
  • 當(dāng)HashSet調(diào)用add()方法存儲對象的時候,先調(diào)用對象的hashCode()方法,然后在集合中查找是否有哈希值相同的對象
    • 如果沒有哈希值相同的對象就直接存入集合
    • 如果有哈希值相同的對象,就和哈希值相同的對象逐個進行equals()筆記,比較結(jié)果為false就存入,true則不存
  • 2.將自定義類的對象存入HashSet去重復(fù)
    • 類中必須重寫hashcode()和equals()方法
    • hashcode():屬性相同的返回值必須相同,屬性不同的返回值盡量不同(提高效率)
    • equals():屬性相同返回true,屬性不同返回false,返回false的時候存儲

定義的Person類

package com.melody.bean;
public class Person {
    private String name;
    private int age;
    /**
     *
     */
    public Person() {
        super();

    }
    /**
     * @param name
     * @param age
     */
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    /**
     * 為什么是31?
     * 1.31是一個質(zhì)數(shù),質(zhì)數(shù)是能被1和自己本身整除的數(shù)
     * 2.31這個數(shù)不大不小
     * 3.31這個數(shù)好算2的5次方-1,2向左移動五位
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

}

下面的是測試類:

package com.melody.set;

import java.util.HashSet;

import com.melody.bean.Person;

public class Demo1_HashSet {
    /**
     * @param args
     * Set集合,無索引,不可以重復(fù),無序(存取不一致)
     */
    public static void main(String[] args) {
//        test1();
        HashSet<Person> hs = new HashSet<>();
        hs.add(new Person("張三", 23));
        hs.add(new Person("李四", 24));
        hs.add(new Person("張三", 23));
        hs.add(new Person("李四", 24));
        hs.add(new Person("李四", 23));

        //添加引用數(shù)據(jù)類型時,若要不重復(fù),需要重寫HashCode和equals方法
        System.out.println(hs.size());
        System.out.println(hs);
    }

    private static void test1() {
        HashSet<String> hs = new HashSet<>();
        hs.add("ce");
        boolean b1 = hs.add("a");
//        boolean b2 = hs.add("a");
        hs.add("b");
        hs.add("c");
        hs.add("d");
        //HashSet 當(dāng)向set集合中存儲重復(fù)元素會返回false
        //HashSet 的繼承體系中有重寫set方法
//        System.out.println("b1 = " + b1 + " b2 = " + b2);
        System.out.println(hs);

        //可以用迭代器方法就可以使用增強for循環(huán)
        for (String string : hs) {
            System.out.println(string);
        }
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末威创,一起剝皮案震驚了整個濱河市码倦,隨后出現(xiàn)的幾起案子根竿,更是在濱河造成了極大的恐慌,老刑警劉巖近范,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓶您,居然都是意外死亡舟陆,警方通過查閱死者的電腦和手機坠非,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門敏沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炎码,你說我怎么就攤上這事盟迟。” “怎么了潦闲?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵攒菠,是天一觀的道長。 經(jīng)常有香客問我歉闰,道長辖众,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任和敬,我火速辦了婚禮凹炸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘概龄。我一直安慰自己还惠,他們只是感情好饲握,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布私杜。 她就那樣靜靜地躺著,像睡著了一般救欧。 火紅的嫁衣襯著肌膚如雪衰粹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天笆怠,我揣著相機與錄音铝耻,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛瓢捉,可吹牛的內(nèi)容都是我干的频丘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼泡态,長吁一口氣:“原來是場噩夢啊……” “哼搂漠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起某弦,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤桐汤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后靶壮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怔毛,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年腾降,在試婚紗的時候發(fā)現(xiàn)自己被綠了拣度。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜂莉,死狀恐怖蜡娶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情映穗,我是刑警寧澤窖张,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蚁滋,受9級特大地震影響宿接,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辕录,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一睦霎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧走诞,春花似錦副女、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至塞绿,卻和暖如春沟涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背异吻。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工裹赴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓棋返,卻偏偏與公主長得像延都,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睛竣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • Java8張圖 11窄潭、字符串不變性 12、equals()方法酵颁、hashCode()方法的區(qū)別 13嫉你、...
    Miley_MOJIE閱讀 3,696評論 0 11
  • 一幽污、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,257評論 0 16
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法簿姨,內(nèi)部類的語法距误,繼承相關(guān)的語法,異常的語法扁位,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 梁鄒高地准潭,小黃山,八面平原域仇。問蒼黃刑然,明月何在,肖鎮(zhèn)左苑暇务∑寐樱縱使十載不相逢,亦有思念在心間垦细。莫遲疑择镇,望山拼馬力,勇向前...
    大韓天子閱讀 210評論 2 0
  • 前一段去看到望兩位好友括改,家中都有1歲左右的小孩腻豌。 一位好友家中小孩正在睡覺,家里靜悄悄的嘱能,她不讓家中發(fā)出一點聲音吝梅,...
    柴子恒閱讀 226評論 0 1