java入門 -- TreeSet類使用詳解

package cn.itcast.collection;

import java.util.Comparator;

import java.util.TreeSet;

/*

* * Collection

* ------| List 有序列表接口列表 實現(xiàn)了List集合接口的類,特點是有序不可重復(fù)

*-----------| ArrayList 內(nèi)部維護(hù)了一個對象數(shù)據(jù),增刪慢先口,但是查詢塊

*-----------| LinedList 內(nèi)部是一個鏈表的數(shù)據(jù)結(jié)構(gòu)历涝,增刪改塊,查詢慢

*-----------| Vector? 底層維護(hù)了一個Object的數(shù)組對象秧廉,和ArrayList實現(xiàn)一樣,但是線程安全的疼电,操作效率低,已經(jīng)被ArrayList取代蔽豺。

*

* ------| Set 無序列表接口 實現(xiàn)Set集合接口的類,特點是無序不可重復(fù)

* ---------| HashSet Hash表? Set接口實現(xiàn)類? 底層使用Hash表來實現(xiàn)的修陡,特點:存儲速度快。

* ---------| TreeSet Set接口實現(xiàn)類? 如果元素具備自然順序的特性濒析,那么就按照自然順序排序存儲

*

* 無序: 元素添加進(jìn)入的順序和遍歷出來的順序是不一致的啥纸。

* 不可重復(fù):如果添加重復(fù)元素号杏,添加不會報錯斯棒,但是不會添加成功;

* Set 接口的實現(xiàn)類

* HashSet 集合類添加元素的原理:

* 當(dāng)向HashSet集合中添加元素的時候,HashSet對象會先調(diào)用元素的HashCode方法返回值荣暮,然后通過

*? 移位等運算就可以得出元素在Hash表中的存儲位置。也就是說如果HashSet得到的hash就是元素的hashCode方法

*? 返回的值穗酥,如果該值已經(jīng)在Hash表中存在惠遏,就不能再添加了》可能發(fā)生的情況:

*

*? 1. 如果Hash表算出的存儲位置目前沒有元素存儲骏啰,那么就可以將元素進(jìn)行存儲:

*? 2. 如果Hash表算出的存儲位置目前已經(jīng)有元素存儲节吮,就會再調(diào)用元素的equals()方法進(jìn)行比較判耕,如果返回true,

*? 說明元素重復(fù),不會進(jìn)行添加壁熄,如果不相等帚豪,說明元素不重復(fù)草丧,就科技繼續(xù)添加,也就是說一個位置放了兩個元素方仿。

*? 因此在Hash表中添加元素,一般要同時重寫元素的equals()和hashCode()方法仙蚜,如果hashCode()的值相等,就通過

*? 再次判斷equels的返回值來判斷是否重復(fù)了委粉。也就是說調(diào)用equals方法的前提是hashCode()返回的值是一樣的,

*? 所以并不是每次都會調(diào)用equals()方法贾节,這些方法都是由HashSet對象來調(diào)用。

*

* 注意:HashCode默認(rèn)情況下是對象的內(nèi)地地址栗涂,但是String對象改寫了Object的HashCode()方法

*

* treeSet 添加自定義對象

*

*

* TreeSet 自定義對象

* 1. 在TreeSet 中添加元素,如果元素本身就具備了自然順序的屬性斤程,那么就按照自然屬性排序:

* 2. 往TreeSet中添加元素的時候,如果元素本身不具備自然順序的屬性忿墅,那么元素所屬的類就要實現(xiàn)comparale接口,

* 實現(xiàn)比較的規(guī)則方法compareTo(),當(dāng)添加元素的時候由TreeSet對象類調(diào)用疚脐。

* 3.如果添加元素的時候comparaTo方法返回的結(jié)果是0,那么該元素就會被視為重復(fù)元素?zé)o法添加棍弄,

* 跟hashCode()和equals()方法沒有任何關(guān)系疟游;

* 4. 如果在TreeSet中添加元素的時候,元素本身不具備自然順序的屬性乡摹,同時元素也沒有實現(xiàn)Comparable接口,那么在創(chuàng)建

* TreeSet的時候聪廉,必須要傳入一個Comparator比較器對象,將元素之間的比較規(guī)則定義在compare函數(shù)中,當(dāng)添加元素的時候

* 自動調(diào)用比較器的compare方法;

*? ? 說明:推薦使用比較器Comparator; 因為比較器定義了可以多處使用》

*

*? ? 5.如果元素本身不具備自然順序特性板熊,元素本身實現(xiàn)了Comparable接口察绷,在創(chuàng)建TreeSet對象的時候干签,也傳入了比較器拆撼,那么安裝比較器

*? ? ? 的規(guī)則優(yōu)先使用》

*

*? ? 6.字符串具備可比性容劳,因為String類已經(jīng)實現(xiàn)了Comparable接口闸度,因此可以直接調(diào)用CompareTo方法

*? ? 字符串的比較規(guī)則:

*? ? 可以找對對應(yīng)相同的字符:比較的是長度

*? ? 可以找到對象不同的字符:比較的是對應(yīng)位置的字符的大小

*

* 自定義比較器的格式:

* class cmp impelements Comparator{

*

* }

*

* TreeSet的存儲原理:

* 底層是通過二叉樹的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,存儲規(guī)則:左小右大莺禁,當(dāng)添加元素的時候依靠的是元素的comparable方法來添加元素

*

*/

class Cmp implements Comparator{

@Override

public int compare(Object o1, Object o2) {

// TODO Auto-generated method stub

Emp e1 = (Emp)o1;

Emp e2 = (Emp)o2;

return e1.id = e2.id;

}

}

class Emp implements Comparable{

int id; //ID號碼

String name; //姓名

double salary; //薪水

public Emp(int id, String name, double salary){

this.id = id;

this.name = name;

this.salary = salary;

}

@Override

public int compareTo(Object o) {

// TODO Auto-generated method stub

Emp e = (Emp)o;

return this.id-e.id; //安裝薪水的大寫排序

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "{"+ this.id +","+ this.name +","+ this.salary +"}";

}

}

public class Demo6 {

public static void main(String[] args){

TreeSet ts = new TreeSet();

ts.add(new Emp(110, "michale", 12341.2));

ts.add(new Emp(112, "tom", 14341.2));

ts.add(new Emp(120, "jim", 32341.2));

ts.add(new Emp(150, "Ann", 124341.2));

System.out.println(ts);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哟冬,一起剝皮案震驚了整個濱河市楼熄,隨后出現(xiàn)的幾起案子浩峡,更是在濱河造成了極大的恐慌可岂,老刑警劉巖翰灾,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異预侯,居然都是意外死亡峰锁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門虹蒋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飒货,“玉大人,你說我怎么就攤上這事塘辅。” “怎么了扣墩?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵扛吞,是天一觀的道長呻惕。 經(jīng)常有香客問我滥比,道長亚脆,這世上最難降的妖魔是什么盲泛? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮寺滚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玛迄。我一直安慰自己,他們只是感情好蓖议,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勒虾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪修然。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天愕宋,我揣著相機與錄音,去河邊找鬼中贝。 笑死,一個胖子當(dāng)著我的面吹牛邻寿,可吹牛的內(nèi)容都是我干的视哑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼挡毅,長吁一口氣:“原來是場噩夢啊……” “哼暴构!你這毒婦竟也來了跪呈?” 一聲冷哼從身側(cè)響起丹壕,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菌赖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉用,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年邑时,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晶丘。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沫浆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情专执,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布本股,位于F島的核電站,受9級特大地震影響桐腌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜案站,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦舱禽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽里伯。三九已至城瞎,卻和暖如春疾瓮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狼电。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肩碟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓削祈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親髓抑。 傳聞我的和親對象是個殘疾皇子咙崎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

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