JavaSE中compare、compareTo的區(qū)別
1.前言
在java當(dāng)中,若是進(jìn)行比較,大家可能第一時(shí)間想到,==或是!=,這種數(shù)學(xué)上的比較符>、
接下來(lái),我就分別介紹并演示這兩種實(shí)現(xiàn)方法。
2.環(huán)境說(shuō)明
環(huán)境說(shuō)明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
3.概述
3.1Comparable 簡(jiǎn)介
首先Comparable是一個(gè)排序接口,這也就表示若一個(gè)類實(shí)現(xiàn)了Comparable接口,則意味著該類支持排序。
public interface Comparable<T> {
public int compareTo(T o);
}3.2Comparable 定義
Comparable 接口僅提供了一個(gè)函數(shù)方法compareTo(),它的定義如下:

那具體該方法有何作用呢?請(qǐng)接著往下看。
compareTo()方法返回的是一個(gè)int類型值, 這里我著重給大家介紹一下。
若你使用compareTo()進(jìn)行a與b的比較,eg:a.compareTo(b),那么,返回值有三種結(jié)果情況,分別如下:
- 若返回值為負(fù)數(shù),則說(shuō)明a
- 若返回值為0,則說(shuō)明a=b;
- 若返回值為正數(shù),則說(shuō)明a>b;
其中,String類就是一個(gè)典例,它就是實(shí)現(xiàn)了Comparable接口。

其中就重寫了Comparable接口中的compareTo()方法,具體實(shí)現(xiàn)邏輯大家可以借鑒。

3.3Comparator 簡(jiǎn)介
接下來(lái),我再給大家講解一下Comparator接口。
首先Comparator是一個(gè)比較器接口,用于類設(shè)計(jì)已經(jīng)完成,還想排序(Arrays)的情況下使用。
目前它只提供了兩個(gè)函數(shù)供使用。
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}3.4Comparator 定義
針對(duì)Comparator接口,若一個(gè)類實(shí)現(xiàn)了它,只需要實(shí)現(xiàn)compare()方法即可,可以不用實(shí)現(xiàn)equals方法,因?yàn)槿魏晤惖某惗际荗bject,查看Object類也可得知equals()就被實(shí)現(xiàn)了。
該方法 int compare(T a, T b) 是“比較a和b的大小”。返回值結(jié)果情況與compareTo()方法一致,具體如下:
- 若返回值為負(fù)數(shù),則說(shuō)明a
- 若返回值為0,則說(shuō)明a=b;
- 若返回值為正數(shù),則說(shuō)明a>b;
3.5區(qū)別
方法的比較
1.compareTo(Object obj)方法是java.lang.Comparable接口中的方法, 當(dāng)需要對(duì)類的對(duì)象進(jìn)行排序時(shí),該類需要實(shí)現(xiàn)Comparable接口,必須重寫compareTo(T o)方法。
比如String類等一些類默認(rèn)實(shí)現(xiàn)了該接口,重寫了 compareTo()方法,例如s1.compareTo(s2),自然返回值就是s1 與 s2 的ASC碼差值,其實(shí)就是字典排序;
2.compare(Object o1, Object o2)方法是java.util.Comparator接口的方法, 它實(shí)際上用的是待比較對(duì)象的compare(T o1, T o2)方法;
3、Comparable 是排序接口,而Comparator 是比較器接口。
4. 實(shí)例演示
4.1.Comparable使用演示
接下來(lái)我先給大家演示下如何實(shí)現(xiàn)Comparable接口的compareTo()方法進(jìn)行排序。
@Data
public class Dog implements Comparable<Dog> {
private String type;
private double price;
public Dog() {
}
public Dog(String name, int price) {
this.type = name;
this.price = price;
}
public String toString() {
return "狗品種為:" + type + ",價(jià)格為:" + price;
}
@Override
public int compareTo(Dog o) {//升序
if (this.price > o.price) {
return 1;
} else if (this.price < o.price) {
return -1;
}
return 0;
}
}寫個(gè)main函數(shù)進(jìn)行測(cè)試驗(yàn)證。演示代碼如下:
public class ComparableTest {
public static void main(String[] args) {
Dog[] dogs = {
new Dog("泰迪", 10),
new Dog("柯基", 78),
new Dog("柴犬", 55),
new Dog("藏獒", 42),
new Dog("斗牛犬", 15)
};
//升序
Arrays.sort(dogs);
for (Dog dog : dogs) {
System.out.println(dog);
}
}
}執(zhí)行main函數(shù),控制臺(tái)打印如下:

我們?cè)僬{(diào)整一下排序規(guī)則,改為按對(duì)象中price價(jià)格進(jìn)行降序。
@Override
public int compareTo(Dog o) {//降序
if (this.price < o.price) {
return 1;
} else if (this.price > o.price) {
return -1;
}
return 0;
}再來(lái)看下價(jià)格。

4.2 Comparable使用演示
我們來(lái)實(shí)現(xiàn)一個(gè)比較器,實(shí)現(xiàn)Comparator接口的compare()方法,其中泛型我直接指定Dog對(duì)象。演示代碼具體如下:
public class ComparatorDog implements Comparator<Dog> {
@Override
public int compare(Dog o1, Dog o2) {
//升序
if (o1.getPrice() > o2.getPrice()) {
return 1;
} else if (o1.getPrice() < o2.getPrice()) {
return -1;
}
return 0;
}
}寫個(gè)測(cè)試類進(jìn)行測(cè)試用例打?。?/p>
public static void main(String[] args) {
Dog[] dogs = {
new Dog("泰迪", 10),
new Dog("柯基", 78),
new Dog("柴犬", 55),
new Dog("藏獒", 42),
new Dog("斗牛犬", 15)
};
//升序
Arrays.sort(dogs,new ComparatorDog());
for (Dog dog : dogs) {
System.out.println(dog);
}
}接下來(lái)運(yùn)行main函數(shù),大家請(qǐng)看控制臺(tái)輸出截圖:

我們稍微調(diào)整下排序規(guī)則,將升序改為降序。具體修改如下:
@Override
public int compare(Dog o1, Dog o2) {
//降序
if (o1.getPrice() < o2.getPrice()) {
return 1;
} else if (o1.getPrice() > o2.getPrice()) {
return -1;
}
return 0;
}我們運(yùn)行main函數(shù)輸出結(jié)果如下截圖:

到此這篇關(guān)于JavaSE中compare、compareTo的區(qū)別的文章就介紹到這了,更多相關(guān)Java compare、compareTo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中compareTo方法使用小結(jié)
- Java中BigDecimal的equals方法和compareTo方法的區(qū)別詳析
- Java中BigDecimal比較大小的3種方法(??compareTo()、??equals()??和??compareTo()??)
- Java compareTo用法詳解
- Java 基礎(chǔ):string中的compareTo方法
- java compare compareTo方法區(qū)別詳解
- java compareTo和compare方法比較詳解
- java使用compareTo實(shí)現(xiàn)一個(gè)類的對(duì)象之間比較大小操作
- Java中替代equals,compareTo和toString的方法
- Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)
- 詳解java中保持compareTo和equals同步
- JAVA中compareTo方法的使用小結(jié)
相關(guān)文章
詳解SpringBoot中JdbcTemplate的事務(wù)控制
JdbcTemplate是spring-jdbc提供的數(shù)據(jù)庫(kù)核心操作類,那對(duì)JdbcTemplate進(jìn)行事務(wù)控制呢,本文就詳細(xì)的介紹一下2021-09-09
Springboot中@Transactional注解與異常處理機(jī)制方式
這篇文章主要介紹了Springboot中@Transactional注解與異常處理機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
java模板引擎Thymeleaf和前端vue的區(qū)別及說(shuō)明
這篇文章主要介紹了java模板引擎Thymeleaf和前端vue的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
java編程實(shí)現(xiàn)優(yōu)先隊(duì)列的二叉堆代碼分享
這篇文章主要介紹了java編程實(shí)現(xiàn)優(yōu)先隊(duì)列的二叉堆代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
java實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)寫入到txt的方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)寫入到txt的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Java基于迭代器模式實(shí)現(xiàn)的訪問人員列表操作示例
這篇文章主要介紹了Java基于迭代器模式實(shí)現(xiàn)的訪問人員列表操作,簡(jiǎn)單描述了迭代器模式的概念、原理以及使用迭代器模式實(shí)現(xiàn)訪問人員列表的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
SpringMVC使用@ExceptionHandler注解在Controller中處理異常
這篇文章主要為大家介紹了SpringMVC使用@ExceptionHandler注解在Controller中處理異常示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

