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

