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>中寫(xiě)比較的類
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接口,并重寫(xiě)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;
}
//重寫(xiě)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>中寫(xiě)比較的類
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方法被重寫(xiě)后,我們就不能輕易修改,這時(shí)候該如何解決呢?
用戶自定義比較器類,實(shí)現(xiàn)Comparator接口,并重寫(xiě)其中的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)景可重寫(xiě))、實(shí)現(xiàn)Comparable接口并重寫(xiě)其中的compareTo() 方法,構(gòu)造比較器類實(shí)現(xiàn)Comparator接口并重寫(xiě)compare()方法。
| 重寫(xiě)方法 | 解釋 |
|---|---|
| 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)多任務(wù)執(zhí)行助手
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多任務(wù)執(zhí)行助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Mybatis plus中使用in查詢出錯(cuò)如何解決
這篇文章主要介紹了Mybatis plus中使用in查詢出錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
使用自定義注解進(jìn)行restful請(qǐng)求參數(shù)的校驗(yàn)方式
這篇文章主要介紹了使用自定義注解進(jìn)行restful請(qǐng)求參數(shù)的校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Spring Boot自定義注解從入門(mén)到實(shí)戰(zhàn)指南
本文介紹了SpringBoot中自定義注解的設(shè)計(jì)、實(shí)現(xiàn)與應(yīng)用技巧,涵蓋了注解基礎(chǔ)、創(chuàng)建自定義注解、注解處理器實(shí)現(xiàn)方案、高級(jí)注解特性、性能優(yōu)化與最佳實(shí)踐、實(shí)戰(zhàn)案例、測(cè)試策略、常見(jiàn)問(wèn)題與解決方案以及總結(jié)與最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2025-12-12
Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析
這篇文章主要介紹了Java8新特性Stream流中anyMatch和allMatch和noneMatch的區(qū)別解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
SparkSQL中的JSON內(nèi)置函數(shù)全解析
你是否曾經(jīng)為處理JSON數(shù)據(jù)而頭疼?SparkSQL為我們提供了強(qiáng)大的內(nèi)置JSON函數(shù),讓JSON處理變得輕而易舉,本文將帶你深入了解這些函數(shù),感興趣的朋友一起看看吧2024-08-08

