Java中Comparable接口和Comparator接口的實(shí)現(xiàn)
前言
Java中基本數(shù)據(jù)類型可以直接比較大小,但引用類型呢?同時(shí)引用對(duì)象中可能存在多個(gè)可比較的字段,那么我們?cè)撛趺幢容^呢?
Java中引用類型不能直接進(jìn)行大小的比較,這種行為在編譯器看來是危險(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ù)姓名來進(jìn)行比較,但是當(dāng)Comparable
接口中的compareTo
方法被重寫后,我們就不能輕易修改,這時(shí)候該如何解決呢?
用戶自定義比較器類,實(shí)現(xiàn)Comparator
接口,并重寫其中的compare
方法。
//也就是說我們可以定義兩個(gè)比較器類來實(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ì)象的比較一般可以使用父類繼承下來的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-02Google?Kaptcha驗(yàn)證碼生成的使用實(shí)例說明
這篇文章主要為大家介紹了Google?Kaptcha驗(yàn)證碼的使用實(shí)例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03java多線程編程之向線程傳遞數(shù)據(jù)的三種方法
在多線程的異步開發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回?cái)?shù)據(jù)時(shí)就無法象函數(shù)一樣通過函數(shù)參數(shù)和return語(yǔ)句來返回?cái)?shù)據(jù)2014-01-01java?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-02Java線程池隊(duì)列LinkedTransferQueue示例詳解
這篇文章主要為大家介紹了Java線程池隊(duì)列LinkedTransferQueue示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟
在Spring Boot配置文件中設(shè)置屬性時(shí),除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機(jī)值和參數(shù)間引用對(duì)屬性值進(jìn)行設(shè)置。下面給大家介紹SpringBoot參數(shù)間引用隨機(jī)數(shù)設(shè)置的操作步驟,感興趣的朋友一起看看吧2021-06-06JAVA反射機(jī)制中g(shù)etClass和class對(duì)比分析
這篇文章主要介紹了JAVA反射機(jī)制中g(shù)etClass和class對(duì)比分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):稀疏數(shù)組
今天帶大家了解一下Java稀疏數(shù)組的相關(guān)知識(shí),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-08-08Spring Boot整合mybatis(一)實(shí)例代碼
sprig-boot是一個(gè)微服務(wù)架構(gòu),加快了spring工程快速開發(fā),以及簡(jiǎn)便了配置。接下來開始spring-boot與mybatis的整合2017-07-07