欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Comparable接口和Comparator接口的實(shí)現(xiàn)

 更新時(shí)間:2025年09月29日 09:09:13   作者:燙燙燙燙燙,,  
本文主要介紹了Java中Comparable接口和Comparator接口的實(shí)現(xiàn),Comparable在類內(nèi)定義比較邏輯,侵入性強(qiáng);Comparator作為獨(dú)立類,侵入性弱,支持靈活排序規(guī)則,兩者均可用于對(duì)象比較,但適用場(chǎng)景不同,下面就來詳細(xì)的介紹有一下

前言

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)文章

  • SpringBoot中YAML配置文件實(shí)例詳解

    SpringBoot中YAML配置文件實(shí)例詳解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中YAML配置文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)通訊錄

    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í)例說明

    Google?Kaptcha驗(yàn)證碼生成的使用實(shí)例說明

    這篇文章主要為大家介紹了Google?Kaptcha驗(yàn)證碼的使用實(shí)例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java多線程編程之向線程傳遞數(shù)據(jù)的三種方法

    java多線程編程之向線程傳遞數(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-01
  • java?JIT調(diào)優(yōu)的實(shí)現(xiàn)

    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示例詳解

    這篇文章主要為大家介紹了Java線程池隊(duì)列LinkedTransferQueue示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟

    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ì)比分析

    這篇文章主要介紹了JAVA反射機(jī)制中g(shù)etClass和class對(duì)比分析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):稀疏數(shù)組

    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í)例代碼

    Spring Boot整合mybatis(一)實(shí)例代碼

    sprig-boot是一個(gè)微服務(wù)架構(gòu),加快了spring工程快速開發(fā),以及簡(jiǎn)便了配置。接下來開始spring-boot與mybatis的整合
    2017-07-07

最新評(píng)論