TreeSet和HashSet去重原理

  • TreeSet 的去重是由所add對(duì)象聲明的compareTo 決定的,而HashSet 會(huì)先去比較對(duì)象的hashcode 方法返回值,如果相同,再去比較對(duì)象的equals方法盟庞。因此一般可以通過改寫對(duì)象的hashcode 和equals方法來修改對(duì)象的判重規(guī)則吃沪。
package baidu.Javabase.comparator;

/**
 * Created by liuchaoqun01 on 18/6/9.
 */
public class Person implements Comparable {

    private String name;

    private Integer age;

    private String mind;

    public Person(String name, Integer age, String mind) {
        this.name = name;
        this.age = age;
        this.mind = mind;
    }

    /**
     * 比較方法在類中聲明,一般是傳入一個(gè)類和當(dāng)前類比較
     * @param o
     * @return
     */
    public int compareTo(Object o) {
        Person person = (Person) o;
        int ret = this.name.compareTo(person.getName());
        if (ret == 0) {
            ret = Integer.compare(this.age, person.getAge());
        }
        if (ret == 0) {
            return this.getMind().compareTo(person.getMind());
        }
        return ret;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getMind() {
        return mind;
    }

    public void setMind(String mind) {
        this.mind = mind;
    }
}

package baidu.Javabase.comparator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 * Created by liuchaoqun01 on 18/6/9.
 */
public class TestComparable {

    //生成待排序數(shù)組
    private static List<Person> generatePersonList() {
        List<Person> retList = new ArrayList<>(16);
        retList.addAll(Arrays.asList(new Person("erMaZi", 19, "good"), new Person("liSi", 17, "bad")
                        , new Person("wangWu", 18, "middle")
                        , new Person("wangWu", 18, "middle")));
        return retList;
    }
    public static void print(String message,List<Person> personList){
        System.out.println(message+":");
        for(Person p:personList){
            System.out.println(p);
        }
        System.out.println();
    }
    public static void print(String message,SortedSet<Person> sortedSet){
        System.out.println(message+":");
        for(Person p:sortedSet){
            System.out.println(p);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        //取數(shù)據(jù)
        List<Person> personList = generatePersonList();
        //排序一: 正常 這個(gè)并未指定比較器,是用的類本身的比較器
        Collections.sort(personList);
        print("Collections.sort(list)",personList);
        //排序二:發(fā)現(xiàn)正常了
        PersonComparator pc = new PersonComparator();
        PersonComparator2 pc2 = new PersonComparator2();
        Collections.sort(personList,pc.thenComparing(pc2));  // 這里是先按照pc排序,再按照pc2 排序
        print("thenComparing",personList);
        //排序三:正常
        SortedSet<Person> ts = new TreeSet<>(personList);

        print("TreeSet",ts);
        //排序四:發(fā)現(xiàn)某個(gè)Person實(shí)例被吃掉了,因?yàn)門reeSet認(rèn)為CompareTo為0什猖,則兩個(gè)Person實(shí)例相同
        SortedSet<Person> ts2 = new TreeSet<>(new PersonComparator());
        ts2.addAll(personList);
        print("TreeSet(Comparator)",ts2);

        List<Integer> list = Arrays.asList(1, 2, 1,3,5,3);
        SortedSet<Integer> it = new TreeSet<>(list);
        System.out.println(it);
    }
}

參考:https://blog.csdn.net/yxb_yingu/article/details/52194988

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末票彪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子不狮,更是在濱河造成了極大的恐慌降铸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荤傲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颈渊,警方通過查閱死者的電腦和手機(jī)遂黍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門终佛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雾家,你說我怎么就攤上這事铃彰。” “怎么了芯咧?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵牙捉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我敬飒,道長(zhǎng)邪铲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任无拗,我火速辦了婚禮带到,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘英染。我一直安慰自己揽惹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布搪搏。 她就那樣靜靜地躺著,像睡著了一般疯溺。 火紅的嫁衣襯著肌膚如雪毕泌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天挠说,我揣著相機(jī)與錄音愿题,去河邊找鬼。 笑死杆兵,一個(gè)胖子當(dāng)著我的面吹牛仔夺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吹艇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昂拂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鼻听,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤联四,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灰羽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鱼辙,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年怠噪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杜跷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憋槐,死狀恐怖淑趾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情近范,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布评矩,位于F島的核電站阱飘,受9級(jí)特大地震影響虱颗,放射性物質(zhì)發(fā)生泄漏蔗喂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望返弹。 院中可真熱鬧爪飘,春花似錦、人聲如沸师崎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)床估。三九已至,卻和暖如春丐巫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碑韵。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工缎脾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人治筒。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓舷蒲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牲平。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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