1、重點
Set集合(去掉重複元素,排序)
2、三個集合的特點
A、Set 不能出現重複元素、元素的輸出無順序
B、List 可以有重複元素、有順序
C、Map 鍵值對的集合,Map的鍵是Set集合
3、判斷兩個對象是否是同一個對象,我們的判斷標準是兩個對象的各個屬性值是否一樣。
4、Set集合判斷是否是重複元素時的兩個依據
A)兩個對象的哈希碼是否相同
B)兩個對象使用equals比較時是否爲真
默認情況下,equals功能==是完全一樣的,所以,爲了讓equals比較對象的屬性值是否相等,必須重寫equals方法。
5、equals方法的重寫規則
A、考慮三種特殊的情況
比較的兩個引用(this和obj)是否指向同一個對象
參數obj是否爲null
參數obj和this是否是同一類型
B、考慮兩對象的屬性值是否相同
C、equals方法的代碼實現
public boolean equals(Object obj) {
System.out.println("正在調用equals方法比較兩個對象的屬性是否相同");
//比較this和參數obj是否相等
//考慮三種特殊的情況
//比較的兩個引用(this和obj)是否指向同一個對象
if(this == obj) return true;
//參數obj是否爲null
if(obj == null) return false;
//參數obj和this是否是同一類型
if(!(obj instanceof Student)) return false;
//判斷兩個對象的所有屬性值是否相同
Student anObject = (Student) obj;
if(this.sid == anObject.sid
&& this.name.equals(anObject.name)
&& this.birthday.equals(anObject.birthday)){
return true;
} else {
return false;
}
6、hashCode()方法重寫
該方法是一個native方法,用於爲對象產生一個哈希碼。
7、自動生成hashCode()和equals()方法
8、TreeSet可以對Set集合中的元素進行排序
如果不排序,不能使用TreeSet,只能使用HashSet
9、排序規則
對集合中的元素進行排序,必須定義排序規則
比較對象的哪個屬性?
返回的結果是大於0、等於0還是小於0?
而排序必須要涉及到屬性的比較,對象的排序本質一就是屬性的排序
只要是比較,就會產生三個結果:大於0、等於0、小於0
10、自然排序
集合元素的類型實現Comparable接口,並實現compareTo(Object obj)方法
比較的是this和obj的大小
示例:
public class Student implements Comparable<Student>{
@Override
public int compareTo(Student o) {
//比較this和o的關係
if(this.sid > o.sid)
return 1;
else if(this.sid == o.sid)
return 0;
else
return -1;
}
}
自然排序的缺點:只能允許一種排序方式
11、客戶化排序
必須定義一個單獨的排序類,排序類要實現Compartor接口,並實現compare(Object o1, Object o2),對o1和o2進行比較。
示例:
public class IDSorted implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.getSid() - o2.getSid();
}
}
使用排序類
IDSorted idSorted = new IDSorted();
Set<Student> set = new TreeSet<Student>(idSorted);
客戶化排序更靈活,因爲從設計的角度來說,客戶化排序符合開-閉原則
小結:如果TreeSet的構造方法不帶任何參數,則使用自然排序
如果TreeSet的構造方法中指定了排序類,則使用客戶化排序
12、List的排序
Collections.sort(list, new IDSorted()); 對List進行客戶化排序
Collections.sort(list); 對List進行自然排序
13、集合的交集、並集、差集
已知有兩個集合:
Set<String> list1 = new HashSet<String>();
list1.add("aa");
list1.add("bb");
list1.add("cc");
Set<String> list2 = new HashSet<String>();
list2.add("cc");
list2.add("dd");
list2.add("ee");
並集
list1.addAll(list2);
for(String a : list1){
System.out.println(a);
}
交集
list1.retainAll(list2);
for(String a : list1){
System.out.println(a);
}
差集
list1.removeAll(list2);
for(String a : list1){
System.out.println(a);
}