Javan基礎:集合

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);

          }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章