淺談Java中幾種常見的比較器的實(shí)現(xiàn)方法
在Java中經(jīng)常會(huì)涉及到對(duì)象數(shù)組的排序問題,那么就涉及到對(duì)象之間的比較問題。
通常對(duì)象之間的比較可以從兩個(gè)方面去看:
第一個(gè)方面:對(duì)象的地址是否一樣,也就是是否引用自同一個(gè)對(duì)象。這種方式可以直接使用“==“來(lái)完成。
第二個(gè)方面:以對(duì)象的某一個(gè)屬性的角度去比較。
從最新的JDK8而言,有三種實(shí)現(xiàn)對(duì)象比較的方法:
一、覆寫Object類的equals()方法;
二、繼承Comparable接口,并實(shí)現(xiàn)compareTo()方法;
三、定義一個(gè)單獨(dú)的對(duì)象比較器,繼承自Comparator接口,實(shí)現(xiàn)compare()方法。
由于使用的排序方式的不同,具體選擇哪種方法來(lái)實(shí)現(xiàn)對(duì)象的比較也會(huì)有所不同。
覆寫equals()方法,一般用于自己實(shí)現(xiàn)對(duì)象數(shù)組排序的情況,而對(duì)于要使用java內(nèi)置的排序算法時(shí),使用后面兩種方式都是可行的。
先來(lái)看第二種方式,這種方式就是讓自己編寫的類繼承Comparable接口,并實(shí)現(xiàn)compareTo()方法,這種情況下,在使用java.util.Arrays.sort()
方法時(shí),不用指定具體的比較器,sort()方法會(huì)使用對(duì)象自己的比較函數(shù)來(lái)完成對(duì)象的排序。
下面是一個(gè)具體的例子:
import java.util.Arrays;
class BookCook implements Comparable<BookCook>{
private String title;
private double price;
public BookCook(String title,double price){
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "書名:"+this.title+",價(jià)格:"+this.price;
}
@Override
public int compareTo(BookCook o) {
if(this.price > o.price){
return 1;
}else if(this.price < o.price){
return -1;
}else{
return 0;
}
}
}
一般我們使用以上兩種方法就能夠滿足實(shí)際的開發(fā)問題。但是當(dāng)出現(xiàn)以下情況時(shí),就需要用到Comparator接口:
要在已經(jīng)開發(fā)好的代碼的基礎(chǔ)上完善對(duì)象的比較功能時(shí),又不想更改之前的代碼,這種情況下,從JDK1.8之后出現(xiàn)了Comparator接口,是對(duì)這種情況的一個(gè)彌補(bǔ)。
這種情況下,我們需要單獨(dú)定義一個(gè)對(duì)象比較器,繼承Comparator接口,并實(shí)現(xiàn)compare()方法。示例代碼如下:
class Student {
private String name;
private double score;
public Student(String name,double score){
this.name = name;
this.score = score;
}
public double getScore(){
return this.score;
}
@Override
public String toString() {
return "姓名:"+this.name+",分?jǐn)?shù):"+this.score;
}
}
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1,Student o2) {
if(o1.getScore() > o2.getScore()){
return 1;
}else if(o1.getScore() < o2.getScore()){
return -1;
}else{
return 0;
}
}
}
public class TestComparator {
public static void main(String[] args) {
Student[] sts = new Student[]{
new Student("小戴",60),
new Student("小王",90),
new Student("老王",80),
new Student("小萱",95)
};
java.util.Arrays.sort(sts, new StudentComparator());
System.out.println(java.util.Arrays.toString(sts));
}
}
以上三種情況,因具體情況的不同,選擇不同的方法解決實(shí)際的問題。
這篇淺談Java中幾種常見的比較器的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java虛擬機(jī)之對(duì)象創(chuàng)建過程與類加載機(jī)制及雙親委派模型
這篇文章主要給大家介紹了關(guān)于Java虛擬機(jī)之對(duì)象創(chuàng)建過程與類加載機(jī)制及雙親委派模型的相關(guān)資料,本文通過示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
springboot執(zhí)行延時(shí)任務(wù)之DelayQueue的使用詳解
DelayQueue是一個(gè)無(wú)界阻塞隊(duì)列,只有在延遲期滿時(shí),才能從中提取元素。這篇文章主要介紹了springboot執(zhí)行延時(shí)任務(wù)-DelayQueue的使用,需要的朋友可以參考下2019-12-12
springboot中redis的緩存穿透問題實(shí)現(xiàn)
這篇文章主要介紹了springboot中redis的緩存穿透問題實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
java數(shù)據(jù)庫(kù)數(shù)據(jù)分批讀取的實(shí)現(xiàn)示例
在處理大量數(shù)據(jù)時(shí),直接從數(shù)據(jù)庫(kù)一次性讀取所有數(shù)據(jù)可能會(huì)導(dǎo)致內(nèi)存溢出或者性能下降,本文就來(lái)介紹一下java數(shù)據(jù)庫(kù)數(shù)據(jù)分批讀取的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-01-01
Spring中@Transactional用法詳細(xì)介紹
這篇文章主要介紹了Spring中@Transactional用法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02
Spring Boot之AOP配自定義注解的最佳實(shí)踐過程
這篇文章主要給大家介紹了關(guān)于Spring Boot之AOP配自定義注解的最佳實(shí)踐過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11

