Java中Comparable接口和Comparator接口的實現(xiàn)
前言
Java中基本數(shù)據(jù)類型可以直接比較大小,但引用類型呢?同時引用對象中可能存在多個可比較的字段,那么我們該怎么比較呢?
Java中引用類型不能直接進行大小的比較,這種行為在編譯器看來是危險的,所以會編譯失??;
想要實現(xiàn)引用類型的比較,那么我們可以實現(xiàn)Comparable接口和Comparator接口
1 Comparable接口
Comparable接口是JDK提供的泛型比較接口類,源碼實現(xiàn)大概如下:
//<T>中寫比較的類
public interface Comparable<T> {
//返回值
// < 0,表示this指向的對象小于o指向的對象
// > 0,表示this指向的對象大于o指向的對象
// == 0,表示this指向的對象等于o指向的對象
int compareTo(T o);
}
通常對于用戶自定義類型,如果想要按照大小進行比較,那么我們需要在定義類的時候?qū)崿F(xiàn)Comparable接口,并重寫compareTo方法。
//存在一個Person類,根據(jù)年齡比較大小
public class Person implements Comparable<Person> {
public String name;
public int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
//重寫compareTo方法
int compareTo(Person o) {
if(o == null) {
return 1;
}
return this.age - o.age;
}
}
//Main.java
public class Main {
public static void main(String[] args) {
Person person1 = new Person("lisi",18);
Person person2 = new Person("wangwu",35);
//比較person1和person2的年齡大小
System.out.println("person1 是否大于 person2 ?");
System.out.println(person1.compareTo(person2) > 0);
}
}
2 Comparator接口
基于比較器方式進行比較,Comparator定義如下:
//<T>中寫比較的類
public interface Comparator<T> {
//返回值
// < 0,表示this指向的對象小于o指向的對象
// > 0,表示this指向的對象大于o指向的對象
// == 0,表示this指向的對象等于o指向的對象
int compare(T o1,T o2);
}
我們知道Person類的比較不僅可以根據(jù)年齡還可以根據(jù)姓名來進行比較,但是當(dāng)Comparable接口中的compareTo方法被重寫后,我們就不能輕易修改,這時候該如何解決呢?
用戶自定義比較器類,實現(xiàn)Comparator接口,并重寫其中的compare方法。
//也就是說我們可以定義兩個比較器類來實現(xiàn)接口Comparator接口
//AgeComparator.java實現(xiàn)年齡比較
public class AgeComparator implements Comparator<Person> {
//根據(jù)年齡比較
public int compare(Person o1,Person 02) {
if(o1 == o1) {
return 0;
}
if(o1 == null || 02 == null) {
return -1;
}
return o1.age - o1.age;
}
}
//NameComparator.java實現(xiàn)年齡比較
public class NameComparator implements Comparator<Person> {
//根據(jù)年齡比較
public int compare(Person o1,Person 02) {
if(o1 == o1) {
return 0;
}
if(o1 == null || 02 == null) {
return -1;
}
return o1.name.compare(o2);
}
}
//Main.java
public class Main {
public static void main(String[] args) {
Person person1 = new Person("lisi",18);
Person person2 = new Person("wangwu",35);
//根據(jù)自定義比較器類分別比較年齡和姓名
System.out.println("根據(jù)姓名比較:");
NameComparator nameComparator = new NameComparator();
System.out.println("person1姓名 是否大于 person2姓名 ?");
System.out.println(nameComparator.compare(person1,person2)> 0);
System.out.println("根據(jù)年齡比較:");
AgeComparator ageComparator = new AgeComparator();
System.out.println("person1年齡 是否大于 person2年齡 ?");
System.out.println(ageComparator.compare(person1,person2)> 0);
}
}
Comparable接口和Comparator接口都可以用于對象的比較,Comparable一般在當(dāng)前類中使用,對當(dāng)前類的侵入性比較強,Comparator對當(dāng)前類的侵入性較弱,可以脫離當(dāng)前類使用,當(dāng)需要實現(xiàn)一個比較器對象。
#對象的比較 對象的比較一般可以使用父類繼承下來的equals()方法(根據(jù)使用場景可重寫)、實現(xiàn)Comparable接口并重寫其中的compareTo() 方法,構(gòu)造比較器類實現(xiàn)Comparator接口并重寫compare()方法。
| 重寫方法 | 解釋 |
|---|---|
| Object.equals(); | 所有類都繼承于Object類 |
| Comparable.compareTo(); | 自定義類手動實現(xiàn)接口,對當(dāng)前類侵入性較強 |
| Comparator.compare(); | 需要構(gòu)造比較器類對象,對當(dāng)前類侵入性較弱 |
到此這篇關(guān)于Java中Comparable接口和Comparator接口的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java Comparable接口和Comparator接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java多線程編程之向線程傳遞數(shù)據(jù)的三種方法
在多線程的異步開發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回數(shù)據(jù)時就無法象函數(shù)一樣通過函數(shù)參數(shù)和return語句來返回數(shù)據(jù)2014-01-01
java?JIT調(diào)優(yōu)的實現(xiàn)
JIT編譯器調(diào)優(yōu)方法包括啟用JIT日志、優(yōu)化熱點代碼、循環(huán)展開、內(nèi)聯(lián)優(yōu)化、逃逸分析以及使用性能分析工具等,本文主要介紹了java?JIT調(diào)優(yōu)的實現(xiàn),感興趣的可以了解一下2025-02-02
Java線程池隊列LinkedTransferQueue示例詳解
這篇文章主要為大家介紹了Java線程池隊列LinkedTransferQueue示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
SpringBoot隨機數(shù)設(shè)置及參數(shù)間引用的操作步驟
在Spring Boot配置文件中設(shè)置屬性時,除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機值和參數(shù)間引用對屬性值進行設(shè)置。下面給大家介紹SpringBoot參數(shù)間引用隨機數(shù)設(shè)置的操作步驟,感興趣的朋友一起看看吧2021-06-06
JAVA反射機制中g(shù)etClass和class對比分析
這篇文章主要介紹了JAVA反射機制中g(shù)etClass和class對比分析,具有一定參考價值,需要的朋友可以了解下。2017-11-11
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):稀疏數(shù)組
今天帶大家了解一下Java稀疏數(shù)組的相關(guān)知識,文中有非常詳細的介紹及代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-08-08

