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接口。

其中就重寫(xiě)了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接口,必須重寫(xiě)compareTo(T o)方法。
比如String類等一些類默認(rèn)實(shí)現(xiàn)了該接口,重寫(xiě)了 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;
}
}寫(xiě)個(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;
}
}寫(xiě)個(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)文章
centos7如何通過(guò)systemctl啟動(dòng)springboot服務(wù)代替java -jar方式啟動(dòng)
這篇文章主要介紹了centos7如何通過(guò)systemctl啟動(dòng)springboot服務(wù)代替java -jar方式啟動(dòng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
spring cloud中微服務(wù)之間的調(diào)用以及eureka的自我保護(hù)機(jī)制詳解
這篇文章主要介紹了spring cloud中微服務(wù)之間的調(diào)用以及eureka的自我保護(hù)機(jī)制詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析
這篇文章主要介紹了redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring?Boot?集成并開(kāi)發(fā)?Sa-token示例詳解
Sa-token是一款高可用的權(quán)限認(rèn)證框架,他帶我們用最簡(jiǎn)化的配置完成用?spring?security?需要進(jìn)行大量配置的才能完成的工作,這篇文章主要介紹了Spring?Boot?集成并開(kāi)發(fā)?Sa-token,需要的朋友可以參考下2023-06-06
淺談Spring Boot 整合ActiveMQ的過(guò)程
本篇文章主要介紹了淺談Spring Boot 整合ActiveMQ的過(guò)程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
使用SpringMVC返回json字符串的實(shí)例講解
下面小編就為大家分享一篇使用SpringMVC返回json字符串的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
SpringBoot中MockMVC單元測(cè)試的實(shí)現(xiàn)
Mock是一種用于模擬和替換類的對(duì)象的方法,以便在單元測(cè)試中獨(dú)立于外部資源進(jìn)行測(cè)試,本文主要介紹了SpringBoot中MockMVC單元測(cè)試的實(shí)現(xiàn),具有應(yīng)該的參考價(jià)值,感興趣的可以了解一下2024-02-02
Java實(shí)現(xiàn)SHA-1算法實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)SHA-1算法,實(shí)例分析了java實(shí)現(xiàn)SHA-1算法的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03

