TreeSet用法
TreeSet可以用于元素進(jìn)行排序及保證元素唯一,可以用過對象實(shí)現(xiàn)Comparable接口哎壳,或者new TreeSet的時(shí)候傳入自定義的比較方法,實(shí)現(xiàn)自定義的排序。
public class TreeSetTest {
public static void main(String[] args){
TreeSet treeSet=new TreeSet();
// treeSet.add("aa");
// treeSet.add("qqq");
// treeSet.add("pppp");
// treeSet.add("aa");
// System.out.println(treeSet);
//自定義對象比較
treeSet.add(new Person("張三",7));
treeSet.add(new Person("李四",888));
treeSet.add(new Person("王五",99));
treeSet.add(new Person("方六",7));
System.out.println(treeSet);
//輸出 [Person{name='張三', age=7}, Person{name='方六', age=7}, Person{name='王五', age=99}, Person{name='李四', age=888}]
//compareTo比較的是字符的大小异逐,char的值
System.out.println("張三".compareTo("李四"));
System.out.println("------------------------------");
//元素也可以通過傳入比較的方法忍抽,實(shí)現(xiàn)自定義的比較
TreeSet treeSet2=new TreeSet(new CompareByLen());
treeSet2.add("aasss");
treeSet2.add("bb");
treeSet2.add("ppppp");
treeSet2.add("nnn");
System.out.println(treeSet2);
//輸出: [bb, nnn, aasss, ppppp]
}
static class CompareByLen implements Comparator<String> {
@Override
public int compare(String s1, String s2) { //按照字符串的長度比較
int num = s1.length() - s2.length(); //長度為主要條件
return num == 0 ? s1.compareTo(s2) : num; //內(nèi)容為次要條件
}
}
}
Person類如下
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
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;
}
@Override
public int compareTo(Person o) {
int num=this.age-o.age;//年齡是第一比較條件
return num==0?this.name.compareTo(o.name):num;//年齡相等八孝,在比較名字
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
compareTo()是怎么進(jìn)行比較的呢?可以比較中文嗎鸠项?
中文也有自己的ascii碼干跛,也是可以比較的,看看源碼祟绊,是通過比較第一個(gè)字符的ascii碼大小驯鳖,如果相等,再繼續(xù)比較下去
image.png
hashSet用法
- hashSet基于HashMap實(shí)現(xiàn)久免,以HashSet的值作為HashMap的一個(gè)key,以一個(gè)Object常量作為hashMap的值浅辙。
- HashSet允許擁有一個(gè)為null的值,HashSet的值不可重復(fù)
- 在創(chuàng)建HashSet的時(shí)候阎姥,如果合適记舆,最好指定其內(nèi)部HashMap的capacity和loadFactory的值,
重寫equals方法的時(shí)候必須匹配相應(yīng)的hashCode()方法呼巴,因?yàn)槿绻恢貙懙脑捲笕瑫?dǎo)致hash不一致,hashMap會把hash不一致的元素放在不同的位置衣赶,導(dǎo)致判斷對象相等時(shí)取到的對象不一致诊赊,產(chǎn)生兩個(gè)對象。
區(qū)別
1.TreeSet背后的結(jié)構(gòu)是TreeMap,也就是紅黑樹府瞄,能夠?qū)崿F(xiàn)自動排序碧磅。通過equals和compareTo方法進(jìn)行內(nèi)容的比較。
2.HashSet背后是HashMap,key是無序的,只能做外部排序鲸郊。既然是Hash,那么就要重寫其對象的hashCode和equals方法丰榴。
1.HashSet可以接受null值,有且只有一個(gè)
2.TreeSet默認(rèn)不可以接受null值秆撮,會直接拋出空指針異常
3.set里沒有重復(fù)數(shù)據(jù)四濒,TreeSet里連虛無都沒有