第十二條: 考慮實(shí)現(xiàn)Comparable接口
(注意本文不適合學(xué)習(xí)京髓,純屬個人筆記)
1. Comparable接口介紹
一個類,如果實(shí)現(xiàn)了Comparable接口宜猜,我們可以很容易的將它在數(shù)組或是集合中進(jìn)行排序。so。横朋。。Comparable這個接口是用來實(shí)現(xiàn)對象排序的百拓。
假設(shè)有這么一個類:
public class CompObj implements Comparable<CompObj> {
private int age;
private String name;
public CompObj(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
//重點(diǎn)在這琴锭,這是接口中唯一的一個方法
@Override
public int compareTo(@NonNull CompObj another) {
return this.age - another.age;
}
}
然后我們可以這樣對他進(jìn)行排序:
List<CompObj> list = ...;//初始化一個list
Collections.sort(list); //集合排序,就是這么簡單
CompObj array[] = ...;//初始化一個數(shù)組
Arrays.sort(list)衙传; //數(shù)組排序决帖,就是這么簡單
現(xiàn)在對comparaTo()方法進(jìn)行簡單說明。
comparaTo()方法傳入該類的另外一個實(shí)例蓖捶,返回一個int值地回,這個方法每執(zhí)行一次都是對傳入的對象和和本生對象進(jìn)行比較。返回的int值如果是一個正值(不包括零)則在數(shù)組或是集合中交換兩個實(shí)例的位置俊鱼,否則位置保持不變刻像。
2. 為什么要考慮實(shí)現(xiàn)Comparable接口
實(shí)現(xiàn)了Comparable接口的類,可以很好的和集合類或是一些泛型算法很好的協(xié)作并闲,你可以付出很小的代價實(shí)現(xiàn)強(qiáng)大的功能细睡。
3. 什么時候應(yīng)該考慮是想Comparable接口
(1)你寫的類是一個值類(前面的文章介紹過)。
(2)類中有很明顯的內(nèi)在排序關(guān)系帝火,如字母排序溜徙、按數(shù)值順序或是時間等洒宝。
(3)前面兩者是并且關(guān)系。
4. 如何很好的實(shí)現(xiàn)Comparable接口
(1)滿足對稱性萌京。
即對象A.comparaTo(B) 大于0的話雁歌,則B.comparaTo(A)必須小于0;
(2)滿足傳遞性。
即對象A.comparaTo(B) 大于0知残,對象B.comparaTo(Z)大于0靠瞎,則對象A.comparaTo(Z)一定要大于0;
(3)建議comparaTo方法和equals()方法保持一致求妹。
即對象A.comparaTo(B)等于0乏盐,則建議A.equals(B)等于true。
(4)對于實(shí)現(xiàn)了Comparable接口的類制恍,盡量不要繼承它父能,而是采取復(fù)合的方式。