JavaSE中compare、compareTo的區(qū)別
1.前言
在java當(dāng)中,若是進(jìn)行比較,大家可能第一時(shí)間想到,==或是!=,這種數(shù)學(xué)上的比較符>、
接下來,我就分別介紹并演示這兩種實(shí)現(xiàn)方法。
2.環(huán)境說明
環(huán)境說明: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ù),則說明a
- 若返回值為0,則說明a=b;
- 若返回值為正數(shù),則說明a>b;
其中,String類就是一個(gè)典例,它就是實(shí)現(xiàn)了Comparable接口。
其中就重寫了Comparable接口中的compareTo()方法,具體實(shí)現(xiàn)邏輯大家可以借鑒。
3.3Comparator 簡(jiǎn)介
接下來,我再給大家講解一下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ù),則說明a
- 若返回值為0,則說明a=b;
- 若返回值為正數(shù),則說明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使用演示
接下來我先給大家演示下如何實(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; }
再來看下價(jià)格。
4.2 Comparable使用演示
我們來實(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); } }
接下來運(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如何通過systemctl啟動(dòng)springboot服務(wù)代替java -jar方式啟動(dòng)
這篇文章主要介紹了centos7如何通過systemctl啟動(dòng)springboot服務(wù)代替java -jar方式啟動(dòng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01spring cloud中微服務(wù)之間的調(diào)用以及eureka的自我保護(hù)機(jī)制詳解
這篇文章主要介紹了spring cloud中微服務(wù)之間的調(diào)用以及eureka的自我保護(hù)機(jī)制詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析
這篇文章主要介紹了redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Spring?Boot?集成并開發(fā)?Sa-token示例詳解
Sa-token是一款高可用的權(quán)限認(rèn)證框架,他帶我們用最簡(jiǎn)化的配置完成用?spring?security?需要進(jìn)行大量配置的才能完成的工作,這篇文章主要介紹了Spring?Boot?集成并開發(fā)?Sa-token,需要的朋友可以參考下2023-06-06使用SpringMVC返回json字符串的實(shí)例講解
下面小編就為大家分享一篇使用SpringMVC返回json字符串的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03SpringBoot中MockMVC單元測(cè)試的實(shí)現(xiàn)
Mock是一種用于模擬和替換類的對(duì)象的方法,以便在單元測(cè)試中獨(dú)立于外部資源進(jìn)行測(cè)試,本文主要介紹了SpringBoot中MockMVC單元測(cè)試的實(shí)現(xiàn),具有應(yīng)該的參考價(jià)值,感興趣的可以了解一下2024-02-02Java實(shí)現(xiàn)SHA-1算法實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)SHA-1算法,實(shí)例分析了java實(shí)現(xiàn)SHA-1算法的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03