最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中元素排序Comparable和Comparator的區(qū)別

 更新時間:2021年12月14日 09:32:01   作者:IT·達(dá)人  
本文主要介紹了java中元素排序Comparable和Comparator的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

初次碰到這個問題是之前有一次電話面試,問了一個小時的問題,其中有一個問題就問到Comparable和Comparator的區(qū)別,當(dāng)時沒答出 來。之后是公司入職時候做的一套Java編程題,里面用JUnit跑用例的時候也用到了Comparator接口,再加上JDK的大量的類包括常見的 String、Byte、Char、Date等都實(shí)現(xiàn)了Comparable接口,因此要學(xué)習(xí)一下這兩個類的區(qū)別以及用法。

Comparable

Comparable可以認(rèn)為是一個內(nèi)比較器,實(shí)現(xiàn)了Comparable接口的類有一個特點(diǎn),就是這些類是可以和自己比較的,至于具體和另一個實(shí)現(xiàn)了Comparable接口的類如何比較,則依賴compareTo方法的實(shí)現(xiàn),compareTo方法也被稱為自然比較方法。如果開發(fā)者add進(jìn)入一個Collection的對象想要Collections的sort方法幫你自動進(jìn)行排序的話,那么這個對象必須實(shí)現(xiàn)Comparable接口。compareTo方法的返回值是int,有三種情況:

1、比較者大于被比較者(也就是compareTo方法里面的對象),那么返回正整數(shù)

2、比較者等于被比較者,那么返回0

3、比較者小于被比較者,那么返回負(fù)整數(shù)

寫個很簡單的例子:

public class Domain implements Comparable<Domain>
{
    private String str;

    public Domain(String str)
    {
        this.str = str;
    }

    public int compareTo(Domain domain)
    {
        if (this.str.compareTo(domain.str) > 0)
            return 1;
        else if (this.str.compareTo(domain.str) == 0)
            return 0;
        else 
            return -1;
    }
    
    public String getStr()
    {
        return str;
    }
}


public static void main(String[] args)
    {
        Domain d1 = new Domain("c");
        Domain d2 = new Domain("c");
        Domain d3 = new Domain("b");
        Domain d4 = new Domain("d");
        System.out.println(d1.compareTo(d2));
        System.out.println(d1.compareTo(d3));
        System.out.println(d1.compareTo(d4));
    }

運(yùn)行結(jié)果為:

0
1
-1

注意一下,前面說實(shí)現(xiàn)Comparable接口的類是可以支持和自己比較的,但是其實(shí)代碼里面Comparable的泛型未必就一定要是Domain,將泛型指定為String或者指定為其他任何任何類型都可以----只要開發(fā)者指定了具體的比較算法就行。?

Comparator

Comparator可以認(rèn)為是是一個外比較器,個人認(rèn)為有兩種情況可以使用實(shí)現(xiàn)Comparator接口的方式:

1、一個對象不支持自己和自己比較(沒有實(shí)現(xiàn)Comparable接口),但是又想對兩個對象進(jìn)行比較

2、一個對象實(shí)現(xiàn)了Comparable接口,但是開發(fā)者認(rèn)為compareTo方法中的比較方式并不是自己想要的那種比較方式

Comparator接口里面有一個compare方法,方法有兩個參數(shù)T o1和T o2,是泛型的表示方式,分別表示待比較的兩個對象,方法返回值和Comparable接口一樣是int,有三種情況:

1、o1大于o2,返回正整數(shù)

2、o1等于o2,返回0

3、o1小于o3,返回負(fù)整數(shù)

寫個很簡單的例子,上面代碼的Domain不變(假設(shè)這就是第2種場景,我對這個compareTo算法實(shí)現(xiàn)不滿意,要自己寫實(shí)現(xiàn)):

public class DomainComparator implements Comparator<Domain>
{
    public int compare(Domain domain1, Domain domain2)
    {
        if (domain1.getStr().compareTo(domain2.getStr()) > 0)
            return 1;
        else if (domain1.getStr().compareTo(domain2.getStr()) == 0)
            return 0;
        else 
            return -1;
    }
}
public static void main(String[] args)
{
    Domain d1 = new Domain("c");
    Domain d2 = new Domain("c");
    Domain d3 = new Domain("b");
    Domain d4 = new Domain("d");
    DomainComparator dc = new DomainComparator();
    System.out.println(dc.compare(d1, d2));
    System.out.println(dc.compare(d1, d3));
    System.out.println(dc.compare(d1, d4));
}

看一下運(yùn)行結(jié)果:

0
1
-1

當(dāng)然因?yàn)榉盒椭付ㄋ懒?,所以?shí)現(xiàn)Comparator接口的實(shí)現(xiàn)類只能是兩個相同的對象(不能一個Domain、一個String)進(jìn)行比較了,因此實(shí)現(xiàn)Comparator接口的實(shí)現(xiàn)類一般都會以"待比較的實(shí)體類+Comparator"來命名

總結(jié)

總結(jié)一下,兩種比較器Comparable和Comparator,后者相比前者有如下優(yōu)點(diǎn):

1、如果實(shí)現(xiàn)類沒有實(shí)現(xiàn)Comparable接口,又想對兩個類進(jìn)行比較(或者實(shí)現(xiàn)類實(shí)現(xiàn)了Comparable接口,但是對compareTo方法內(nèi)的比較算法不滿意),那么可以實(shí)現(xiàn)Comparator接口,自定義一個比較器,寫比較算法

2、實(shí)現(xiàn)Comparable接口的方式比實(shí)現(xiàn)Comparator接口的耦合性 要強(qiáng)一些,如果要修改比較算法,要修改Comparable接口的實(shí)現(xiàn)類,而實(shí)現(xiàn)Comparator的類是在外部進(jìn)行比較的,不需要對實(shí)現(xiàn)類有任何修 改。從這個角度說,其實(shí)有些不太好,尤其在我們將實(shí)現(xiàn)類的.class文件打成一個.jar文件提供給開發(fā)者使用的時候。實(shí)際上實(shí)現(xiàn)Comparator 接口的方式后面會寫到就是一種典型的策略模式。

當(dāng)然,這不是鼓勵用Comparator,意思是開發(fā)者還是要在具體場景下選擇最合適的那種比較器而已。

到此這篇關(guān)于java中元素排序Comparable和Comparator的區(qū)別的文章就介紹到這了,更多相關(guān)java Comparable和Comparator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Task定時任務(wù)的配置和使用詳解

    Spring Task定時任務(wù)的配置和使用詳解

    本篇文章主要介紹了Spring Task定時任務(wù)的配置和使用詳解,實(shí)例分析了Spring Task定時任務(wù)的配置和使用的技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2017-04-04
  • Java設(shè)計(jì)模式七大原則之單一職責(zé)原則詳解

    Java設(shè)計(jì)模式七大原則之單一職責(zé)原則詳解

    單一職責(zé)原則(Single Responsibility Principle, SRP),有且僅有一個原因引起類的變更。簡單來說,就是針對一個java類,它應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé)。本文將詳細(xì)介紹一下Java設(shè)計(jì)模式七大原則之一的單一職責(zé)原則,需要的可以參考一下
    2022-02-02
  • JAVA通過HttpURLConnection 上傳和下載文件的方法

    JAVA通過HttpURLConnection 上傳和下載文件的方法

    這篇文章主要介紹了JAVA通過HttpURLConnection 上傳和下載文件的方法,非常具有實(shí)用價值,需要的朋友可以參考下
    2017-09-09
  • Java搜索與圖論之DFS和BFS算法詳解

    Java搜索與圖論之DFS和BFS算法詳解

    DFS指在進(jìn)行算法運(yùn)算時,優(yōu)先將該路徑的當(dāng)前路徑執(zhí)行完畢,執(zhí)行完畢或失敗后向上回溯嘗試其他途徑。BFS指在進(jìn)行算法運(yùn)算時,優(yōu)先將當(dāng)前路徑點(diǎn)的所有情況羅列出來,然后根據(jù)羅列出來的情況羅列下一層。本文介紹了二者的實(shí)現(xiàn)與應(yīng)用,需要的可以參考一下
    2022-11-11
  • springboot2.0使用Hikari連接池的方法(替換druid)

    springboot2.0使用Hikari連接池的方法(替換druid)

    這篇文章主要介紹了springboot 2.0使用Hikari連接池的方法(替換druid),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 如何在Spring data中使用r2dbc詳解

    如何在Spring data中使用r2dbc詳解

    這篇文章主要給大家介紹了關(guān)于如何在Spring data中使用r2dbc的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java?list移除元素相關(guān)操作指南

    Java?list移除元素相關(guān)操作指南

    這篇文章主要給大家介紹了關(guān)于Java?list移除元素相關(guān)操作的相關(guān)資料,文中介紹的方法包括增強(qiáng)for循環(huán)、迭代器、Stream流和removeIf()方法,同時還介紹了如何從一個列表中刪除包含另一個列表元素的方法,以及如何刪除指定下標(biāo)位置的元素,需要的朋友可以參考下
    2024-12-12
  • Java雙重校驗(yàn)鎖單例原理

    Java雙重校驗(yàn)鎖單例原理

    大家好,本篇文章主要講的是Java雙重校驗(yàn)鎖單例原理,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 淺談Java中真的只有值傳遞么

    淺談Java中真的只有值傳遞么

    這篇文章主要介紹了淺談Java中真的只有值傳遞么?文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot MongoDB與MongoDB GridFS基本使用

    SpringBoot MongoDB與MongoDB GridFS基本使用

    這篇文章主要為大家介紹了SpringBoot MongoDB與MongoDB GridFS基本使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論

洛隆县| 广水市| 遵化市| 安图县| 晋州市| 金阳县| 湟源县| 古蔺县| 苏尼特右旗| 峨眉山市| 晋城| 永福县| 绥中县| 枞阳县| 合山市| 南岸区| 翁源县| 嘉禾县| 石楼县| 西贡区| 鄂伦春自治旗| 突泉县| 洪雅县| 巫山县| 鸡泽县| 平谷区| 锡林郭勒盟| 宁乡县| 齐河县| 金湖县| 东至县| 黑山县| 尉犁县| 平原县| 公主岭市| 徐闻县| 漳浦县| 安新县| 忻城县| 庄河市| 临沧市|