1數據結構-1.2-set

Set:

注重獨一無二的性質,該體系集合可以知道某物是否已近存在于集合中,不會存儲重復的元素,用于存儲無序(存入和取出的順序不一定相同)元素埃碱,值不能重復猖辫。

HashSet:

1、hashset的避免重復是通過hashcode()和equals方法進行判斷是否重復砚殿,先比較hashcode如果不同啃憎,加入,后續(xù)不在調equals方法似炎;如果相同在比較equals方法辛萍,false加入,true拋棄羡藐。
2贩毕、hashset底層實現是hashmap。
3传睹、如果對象的hashCode值是不同的耳幢,那么HashSet會認為對象是不可能相等的。因此我們自定義類的時候需要重寫hashCode欧啤,來確保對象具有相同的hashCode值。

4启上、hashcode 是一樣的equals為false的元素就是在同樣的hash值下順延邢隧,也就是hash一樣的存一列。如下圖冈在。
哈希表

TreeSet

TreeSet實現了SortedSet接口,它是一個有序的集合類,TreeSet的底層是通過TreeMap實現的快骗。TreeSet并不是根據插入的順序來排序株旷,而是根據實際的值的大小來排序。TreeSet也支持兩種排序方式:
方式一:元素自身具備比較性

元素自身具備比較性溅固,需要元素實現Comparable接口付秕,重寫compareTo方法,也就是讓元素自身具備比較性侍郭,這種方式叫做元素的自然排序也叫做默認排序询吴。

方式二:容器具備比較性

當元素自身不具備比較性掠河,或者自身具備的比較性不是所需要的。那么此時可以讓容器自身具備猛计。需要定義一個類實現接口Comparator唠摹,重寫compare方法,并將該接口的子類實例對象作為參數傳遞給TreeMap集合的構造方法奉瘤。

注意:當Comparable比較方式和Comparator比較方式同時存在時勾拉,以Comparator的比較方式為主;

一盗温,讓元素自身具備比較性藕赞。
也就是元素需要實現Comparable接口,覆蓋compareTo 方法肌访。
這種方式也作為元素的自然排序找默,也可稱為默認排序。
年齡按照搜要條件吼驶,年齡相同再比姓名惩激。

public class Demo4 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new Person("aa", 20, "男"));
        ts.add(new Person("bb", 18, "女"));
        ts.add(new Person("cc", 17, "男"));
        ts.add(new Person("dd", 17, "女"));
        ts.add(new Person("dd", 15, "女"));
        ts.add(new Person("dd", 15, "女"));
 
 
        System.out.println(ts);
        System.out.println(ts.size()); // 5
 
    }
}
 
class Person implements Comparable {
    private String name;
    private int age;
    private String gender;
 
    public Person() {
 
    }
 
    public Person(String name, int age, String gender) {
 
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getGender() {
        return gender;
    }
 
    public void setGender(String gender) {
        this.gender = gender;
    }
 
    @Override
    public int hashCode() {
        return name.hashCode() + age * 37;
    }
 
    public boolean equals(Object obj) {
        System.err.println(this + "equals :" + obj);
        if (!(obj instanceof Person)) {
            return false;
        }
        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.age;
 
    }
 
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + gender
                + "]";
    }
 
    @Override
    public int compareTo(Object obj) {
        
        Person p = (Person) obj;
        System.out.println(this+" compareTo:"+p);
        if (this.age > p.age) {
            return 1;
        }
        if (this.age < p.age) {
            return -1;
        }
        return this.name.compareTo(p.name);
    }

二,讓容器自身具備比較性蟹演,自定義比較器风钻。
需求:當元素自身不具備比較性,或者元素自身具備的比較性不是所需的酒请。
那么這時只能讓容器自身具備骡技。
定義一個類實現Comparator 接口,覆蓋compare方法羞反。
并將該接口的子類對象作為參數傳遞給TreeSet集合的構造函數布朦。
當Comparable比較方式,及Comparator比較方式同時存在昼窗,以Comparator比較方式為主是趴。

public class Demo5 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet(new MyComparator());
        ts.add(new Book("think in java", 100));
        ts.add(new Book("java 核心技術", 75));
        ts.add(new Book("現代操作系統(tǒng)", 50));
        ts.add(new Book("java就業(yè)教程", 35));
        ts.add(new Book("think in java", 100));
        ts.add(new Book("ccc in java", 100));
 
        System.out.println(ts); 
    }
}
 
class MyComparator implements Comparator {
 
    public int compare(Object o1, Object o2) {
        Book b1 = (Book) o1;
        Book b2 = (Book) o2;
        System.out.println(b1+" comparator "+b2);
        if (b1.getPrice() > b2.getPrice()) {
            return 1;
        }
        if (b1.getPrice() < b2.getPrice()) {
            return -1;
        }
        return b1.getName().compareTo(b2.getName());
    }
 
}
 
class Book {
    private String name;
    private double price;
 
    public Book() {
 
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public double getPrice() {
        return price;
    }
 
    public void setPrice(double price) {
        this.price = price;
    }
 
    public Book(String name, double price) {
 
        this.name = name;
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "Book [name=" + name + ", price=" + price + "]";
    }
 
}

安全的set

方式一:
Set s=Collections.synchronizedSet(new Hashset<...>());
方式二:

    Set s = new HashSet<String>;
    Map<String,Boolean> m = new ConcurrentHash<>();
    public void add(String st) {
        s.add(st);
        m.put(st);
    }
}

方式三:
谷歌的guava其實已經實現了線程安全的ConcurrentHashSet,
Set<String> s = Sets.newConcurrentHashSet();

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末澄惊,一起剝皮案震驚了整個濱河市唆途,隨后出現的幾起案子,更是在濱河造成了極大的恐慌掸驱,老刑警劉巖肛搬,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異毕贼,居然都是意外死亡温赔,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門帅刀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來让腹,“玉大人远剩,你說我怎么就攤上這事『希” “怎么了瓜晤?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腹纳。 經常有香客問我痢掠,道長,這世上最難降的妖魔是什么嘲恍? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任足画,我火速辦了婚禮,結果婚禮上佃牛,老公的妹妹穿的比我還像新娘淹辞。我一直安慰自己,他們只是感情好俘侠,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布象缀。 她就那樣靜靜地躺著,像睡著了一般爷速。 火紅的嫁衣襯著肌膚如雪央星。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天惫东,我揣著相機與錄音莉给,去河邊找鬼。 笑死廉沮,一個胖子當著我的面吹牛颓遏,可吹牛的內容都是我干的。 我是一名探鬼主播滞时,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼州泊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漂洋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤力喷,失蹤者是張志新(化名)和其女友劉穎刽漂,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體弟孟,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贝咙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了拂募。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庭猩。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窟她,死狀恐怖,靈堂內的尸體忽然破棺而出蔼水,到底是詐尸還是另有隱情震糖,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布趴腋,位于F島的核電站吊说,受9級特大地震影響,放射性物質發(fā)生泄漏优炬。R本人自食惡果不足惜颁井,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢护。 院中可真熱鬧雅宾,春花似錦、人聲如沸葵硕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬芥。三九已至吐辙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蘸劈,已是汗流浹背昏苏。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留威沫,地道東北人贤惯。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像棒掠,于是被迫代替她去往敵國和親孵构。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • 一、集合入門總結 集合框架: Java中的集合框架大類可分為Collection和Map雾袱;兩者的區(qū)別: 1恤筛、Col...
    程序員歐陽閱讀 11,560評論 2 61
  • 上一篇文章介紹了Set集合的通用知識。Set集合中包含了三個比較重要的實現類:HashSet芹橡、TreeSet和En...
    Ruheng閱讀 15,646評論 3 57
  • 殘月寒山風霜 夜話卻酒涼 徒留一生惆悵 歲月且憂傷 本是春夏到霜降 故人卻不知何方 人心生死難思量 天涯又何妨 劍...
    落落_閱讀 295評論 0 0
  • 早上八點到店毒坛,跟進了一下來店體驗客戶的情況,了解到客人是來上海出差時間一周,家在杭州煎殷,離江干區(qū)錢江新城四站地比較近...
    童樺_aa77閱讀 281評論 1 1
  • 有一個人屯伞,他是你的領導。但是他嚴師慈父的形象一直刻在我的心里豪直。今天晚上他的歡送會劣摇,很多人落淚也包括我,此刻...
    自由在路上閱讀 514評論 0 3