Java集合框架篇-59-TreeSet儲存基本資料型別和自定義類物件
這篇開始,我們來學習Set介面的另外一個實現子類TreeSet。TreeSet一般是需要排序才使用的一種集合儲存方式,由於繼承了Set介面,TreeSet也能實現元素的唯一。下面通過兩個練習來理解TreeSet儲存基本的包裝類和自定義資料型別的過程。
1.TreeSet儲存Integer物件
package treeset; import java.util.TreeSet; public class Demo1_TreeSet { public static void main(String[] args) { TreeSet<Integer> ts = new TreeSet<>(); ts.add(1); ts.add(1); ts.add(5); ts.add(5); ts.add(3); ts.add(3); ts.add(4); System.out.println(ts); } }
執行輸出:
[1, 3, 4, 5]
這個程式碼執行結果,證明了TreeSet是可以保證元素唯一儲存和TreeSet是預設按照元素從小到大排序。如果需要對一堆元素進行排序,那麼我們就會考慮使用TreeSet集合來儲存。
2.TreeSet儲存自定義類物件
還是利用前面用過的Person.java這個類
package bean; public class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); 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 String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
下面,寫一個TreeSet儲存多個Person物件。
package treeset; import java.util.TreeSet; import bean.Person; public class Demo1_TreeSet { public static void main(String[] args) { TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("張三",23)); ts.add(new Person("李四",24)); ts.add(new Person("王五",25)); System.out.println(ts); } }
執行一下,結果報“Exception in thread "main" java.lang.ClassCastException: bean.Person cannot be cast to java.lang.Comparable”。這個異常是類轉換異常,我們先來在API中搜索看看Comparable這個介面,這個介面下有一個compareTo()方法,返回是int型別。就是一個兩個物件比較順序的方法。
就像前面我們介紹ArrayList的時候,比較兩個自定義物件是否相同,需要重寫equals方法,那麼我們也在Person下重寫compareTo()方法試試。我們讓Person類繼承Comparable介面,然後重寫compareTo()方法。
package bean;
public class Person implements Comparable {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
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 String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
return 0;
}
}
然後再次執行Demo1_TreeSet.java這個類,執行輸出:[Person [name=張三, age=23]],先不管為什麼return 0的時候只有一個元素儲存進來了。我們分別把return 0改成 reutrn 1和reutrn -1,看看有什麼效果。
1) 改成return 1,執行結果
[Person [name=張三, age=23], Person [name=李四, age=24], Person [name=王五, age=25]]
2) 改成return -1,執行結果
[Person [name=王五, age=25], Person [name=李四, age=24], Person [name=張三, age=23]]
上面的測試結果,這裡先記錄一下結論。
1)當compareTo方法返回0,集合中只有一個元素
2)當compareTo方法返回正數,集合會怎麼存就怎麼取的順序
3)當compareTo方法返回負數,集合就會倒序存取
上面compareTo我們只測試了0 -1 和1,其實正數和負數是符合上面的結論。關於為什麼會是這樣,TreeSet的原理是什麼,下一篇介紹和學習。