package cn.itcast.collection;
import java.util.TreeSet;
/*
* * Collection
* ------| List 有序列表接口列表 實(shí)現(xiàn)了List集合接口的類钠四,特點(diǎn)是有序不可重復(fù)
*-----------| ArrayList 內(nèi)部維護(hù)了一個(gè)對(duì)象數(shù)據(jù)挫鸽,增刪慢绵载,但是查詢塊
*-----------| LinedList 內(nèi)部是一個(gè)鏈表的數(shù)據(jù)結(jié)構(gòu)磁奖,增刪改塊超营,查詢慢
*-----------| Vector? 底層維護(hù)了一個(gè)Object的數(shù)組對(duì)象,和ArrayList實(shí)現(xiàn)一樣,但是線程安全的,操作效率低渴邦,已經(jīng)被ArrayList取代。
*
* ------| Set 無(wú)序列表接口 實(shí)現(xiàn)Set集合接口的類拘哨,特點(diǎn)是無(wú)序不可重復(fù)
* ---------| HashSet Hash表? Set接口實(shí)現(xiàn)類? 底層使用Hash表來(lái)實(shí)現(xiàn)的谋梭,特點(diǎn):存儲(chǔ)速度快。
* ---------| TreeSet Set接口實(shí)現(xiàn)類? 如果元素具備自然順序的特性倦青,那么就按照自然順序排序存儲(chǔ)
*
* 無(wú)序: 元素添加進(jìn)入的順序和遍歷出來(lái)的順序是不一致的瓮床。
* 不可重復(fù):如果添加重復(fù)元素,添加不會(huì)報(bào)錯(cuò),但是不會(huì)添加成功;
* Set 接口的實(shí)現(xiàn)類
* HashSet 集合類添加元素的原理:
* 當(dāng)向HashSet集合中添加元素的時(shí)候纤垂,HashSet對(duì)象會(huì)先調(diào)用元素的HashCode方法返回值,然后通過
*? 移位等運(yùn)算就可以得出元素在Hash表中的存儲(chǔ)位置磷账。也就是說如果HashSet得到的hash就是元素的hashCode方法
*? 返回的值峭沦,如果該值已經(jīng)在Hash表中存在,就不能再添加了》可能發(fā)生的情況:
*
*? 1. 如果Hash表算出的存儲(chǔ)位置目前沒有元素存儲(chǔ)逃糟,那么就可以將元素進(jìn)行存儲(chǔ):
*? 2. 如果Hash表算出的存儲(chǔ)位置目前已經(jīng)有元素存儲(chǔ)吼鱼,就會(huì)再調(diào)用元素的equals()方法進(jìn)行比較,如果返回true,
*? 說明元素重復(fù)绰咽,不會(huì)進(jìn)行添加菇肃,如果不相等,說明元素不重復(fù)取募,就科技繼續(xù)添加琐谤,也就是說一個(gè)位置放了兩個(gè)元素。
*? 因此在Hash表中添加元素玩敏,一般要同時(shí)重寫元素的equals()和hashCode()方法斗忌,如果hashCode()的值相等,就通過
*? 再次判斷equels的返回值來(lái)判斷是否重復(fù)了旺聚。也就是說調(diào)用equals方法的前提是hashCode()返回的值是一樣的织阳,
*? 所以并不是每次都會(huì)調(diào)用equals()方法,這些方法都是由HashSet對(duì)象來(lái)調(diào)用砰粹。
*
* 注意:HashCode默認(rèn)情況下是對(duì)象的內(nèi)地地址唧躲,但是String對(duì)象改寫了Object的HashCode()方法
*
* treeSet 添加自定義對(duì)象
*
*
* treeSet 自定義對(duì)象
* 1. 在TreeSet 中添加元素,如果元素本身就具備了自然順序的屬性碱璃,那么就按照自然屬性排序:
* 2. 往TreeSet中添加元素的時(shí)候弄痹,如果元素本身不具備自然順序的屬性,那么元素所屬的類就要實(shí)現(xiàn)comparale接口厘贼,
* 實(shí)現(xiàn)比較的規(guī)則方法compareTo(),當(dāng)添加元素的時(shí)候由TreeSet對(duì)象類調(diào)用界酒。
*
*
*/
class Emp implements Comparable{
int id; //ID號(hào)碼
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);
}
}