java的Comparable接口詳解


一、介紹

  在java中接口comparable使我們經常要接觸到的,比如對集合或者數組進行排序,我們經常使用到Arrays.sort()或者Collections.sort().當集合中的對象是自定義的對象時,我們有兩種方法能夠使排序方法應用到自定義對象的集合(數組)中。下面我們介紹Comparable的用法。

二、java庫提供的對象的排序

  下面是List中對Integer對象的排序
public class MainClass {
public static void main(String[] args) {
 List<Integer> list = new ArrayList<Integer>();
 Random rd = new Random();
 for(int i=0;i<10;i++)
   list.add(rd.nextInt(100));
 for(int i:list)
   System.out.print(i+" ");
 Collections.sort(list);
 System.out.println("");
 for(int i:list)
   System.out.print(i+" ");
}
}

這很簡單,結果如下:

我們通過Integer的源碼可以看出Integer類繼承了Comparable接口

並且重寫了compareTo,這也是Comparable中唯一的方法。

三、自定義對象的排序

  自定義對象同樣需要繼承Comparable接口,並重寫compareTo方法,這里我們舉一個比較學生成績的Student類,如下:
class Student implements Comparable<Student>{
	int sno;
	int score;
	Student(int sno,int score){
		this.sno = sno;
		this.score = score;
	}
	@Override
	public int compareTo(Student o) {
		if(this.score<o.score) return -1;
		else if(this.score>o.score) return 1;
		else return 0;
	}
}

我們設本對象為A,比較的對象為B,用於比較的屬性為x。在compareTo方法中,若A.x<B.x則返回-1,若A.x>B.x則返回1,相等的返回0。這里我們建議如果A.compareTo(B)==0,那么為了保證一致性A.equals(B)中最好也要為真(但這並不強制),可以根據實際情況決定是否重寫equals(同樣還有hashcode方法),這樣在set或者map類型的集合中需葯保證compareTo和equals的一致性。

執行的結果如下:

如果上面例子中的Student不繼承成Comparable接口,程序會報錯,編譯通不過。這里我們需要注意一點的是只有繼承了Comparable接口並重寫了compareTo方法,這個類才視為Compareable類,如果值寫了compareTo方法,沒有明確implement Comparable則其只是一個普通的類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM