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

java 中Comparable與Comparator詳解與比較

 更新時(shí)間:2017年04月08日 14:23:40   投稿:lqh  
這篇文章主要介紹了java 中Comparable與Comparator詳解與比較的相關(guān)資料,需要的朋友可以參考下

java 中Comparable與Comparator詳解

今天查看TreeMap的源碼,發(fā)現(xiàn)其鍵必須是實(shí)現(xiàn)Comparable或者Comparator的接口時(shí)產(chǎn)生了一些興趣,比如在TreeMap中的put方法分別對(duì)Comparable和Comparator接口分別進(jìn)行處理。那么疑問(wèn)就來(lái)了,Comparable和Comparator接口的區(qū)別是什么,Java中為什么會(huì)存在兩個(gè)類(lèi)似的接口?

  Comparable和Comparator接口都是用來(lái)比較大小的,首先來(lái)看一下Comparable的定義:

 package java.lang;
import java.util.*;
public interface Comparable<T> {
  public int compareTo(T o);
}

  Comparator的定義如下:

package java.util;
public interface Comparator<T> {
  int compare(T o1, T o2);
  boolean equals(Object obj);
}

  Comparable對(duì)實(shí)現(xiàn)它的每個(gè)類(lèi)的對(duì)象進(jìn)行整體排序。這個(gè)接口需要類(lèi)本身去實(shí)現(xiàn)(這句話沒(méi)看懂?沒(méi)關(guān)系,接下來(lái)看個(gè)例子就明白了)。若一個(gè)類(lèi)實(shí)現(xiàn)了Comparable 接口,實(shí)現(xiàn) Comparable 接口的類(lèi)的對(duì)象的 List 列表 ( 或數(shù)組)可以通過(guò) Collections.sort(或 Arrays.sort)進(jìn)行排序。此外,實(shí)現(xiàn) Comparable 接口的類(lèi)的對(duì)象 可以用作 “有序映射 ( 如 TreeMap)” 中的鍵或 “有序集合 (TreeSet)” 中的元素,而不需要指定比較器。

  舉例(類(lèi)Person1實(shí)現(xiàn)了Comparable接口)

package collections;

public class Person1 implements Comparable<Person1>
{
  private int age;
  private String name;

  public Person1(String name, int age)
  {
    this.name = name;
    this.age = age;
  }
  @Override
  public int compareTo(Person1 o)
  {
    return this.age-o.age;
  }
  @Override 
  public String toString()
  {
    return name+":"+age;
  }
}

  可以看到Person1實(shí)現(xiàn)了Comparable接口中的compareTo方法。實(shí)現(xiàn)Comparable接口必須修改自身的類(lèi),即在自身類(lèi)中實(shí)現(xiàn)接口中相應(yīng)的方法。

  測(cè)試代碼:

 Person1 person1 = new Person1("zzh",18);
    Person1 person2 = new Person1("jj",17);
    Person1 person3 = new Person1("qq",19);

    List<Person1> list = new ArrayList<>();
    list.add(person1);
    list.add(person2);
    list.add(person3);

    System.out.println(list);
    Collections.sort(list);
    System.out.println(list);

  輸出結(jié)果:

[zzh:18, jj:17, qq:19]
[jj:17, zzh:18, qq:19]

  如果我們的這個(gè)類(lèi)無(wú)法修改,譬如String,我們又要對(duì)其進(jìn)行排序,當(dāng)然String中已經(jīng)實(shí)現(xiàn)了Comparable接口,如果單純的用String舉例就不太形象。對(duì)類(lèi)自身無(wú)法修改這就用到了Comparator這個(gè)接口(策略模式)。

public final class Person2
{
  private int age;
  private String name;

  public Person2(String name, int age)
  {
    this.name = name;
    this.age = age;
  }

  @Override 
  public String toString()
  {
    return name+":"+age;
  }

  //getter and setter方法省略....
}

  如類(lèi)Person2,這個(gè)類(lèi)已經(jīng)固定,無(wú)法進(jìn)行對(duì)其類(lèi)自身的修改,也修飾詞final了,你也別想繼承再implements Comparable,那么此時(shí)怎么辦呢?在類(lèi)的外部使用Comparator的接口。如下測(cè)試代碼:

 Person2 p1 = new Person2("zzh",18);
    Person2 p2 = new Person2("jj",17);
    Person2 p3 = new Person2("qq",19);
    List<Person2> list2 = new ArrayList<Person2>();
    list2.add(p1);
    list2.add(p2);
    list2.add(p3);
    System.out.println(list2);
    Collections.sort(list2,new Comparator<Person2>(){

      @Override
      public int compare(Person2 o1, Person2 o2)
      {
        if(o1 == null || o2 == null)
          return 0;
        return o1.getAge()-o2.getAge();
      }

    });
    System.out.println(list2);

  輸出結(jié)果:

[zzh:18, jj:17, qq:19]
[jj:17, zzh:18, qq:19] 

  這里(public static <T> void sort(List<T> list, Comparator<? super T> c) )采用了內(nèi)部類(lèi)的實(shí)現(xiàn)方式,實(shí)現(xiàn)compare方法,對(duì)類(lèi)Person2的list進(jìn)行排序。

  再譬如博主遇到的真實(shí)案例中,需要對(duì)String進(jìn)行排序,且不區(qū)分大小寫(xiě),我們知道String中的排序是字典排序,譬如:A a D排序之后為A D a,這樣顯然不對(duì),那么該怎么辦呢?同上(下面代碼中的list是一個(gè)String的List集合):

 Collections.sort(list, new Comparator<String>()
    {
      @Override
      public int compare(String o1, String o2)
      {
        if(o1 == null || o2 == null)
          return 0;
        return o1.toUpperCase().compareTo(o2.toUpperCase());
      }
    });

  這樣就可以實(shí)現(xiàn)不區(qū)分大小進(jìn)行排序String的集合了,是不是很方便~

  細(xì)心的同學(xué)可能會(huì)有疑問(wèn),明明在Comparator接口中定義了兩個(gè)方法,為什么繼承的時(shí)候只實(shí)現(xiàn)了一個(gè)方法,難道要顛覆我對(duì)Java接口常識(shí)的理解了嚒?

  實(shí)際上,我們知道當(dāng)一個(gè)類(lèi)沒(méi)有顯式繼承父類(lèi)的時(shí)候,會(huì)有一個(gè)默認(rèn)的父類(lèi),即java.lang.Object,在Object類(lèi)中有一個(gè)方法即為equals方法,所以這里并不強(qiáng)制要求實(shí)現(xiàn)Comparator接口的類(lèi)要實(shí)現(xiàn)equals方法,直接調(diào)用父類(lèi)的即可,雖然你顯式的實(shí)現(xiàn)了equals()方法 will be a better choice~

  在《Effective Java》一書(shū)中,作者Joshua Bloch推薦大家在編寫(xiě)自定義類(lèi)的時(shí)候盡可能的考慮實(shí)現(xiàn)一下Comparable接口,一旦實(shí)現(xiàn)了Comparable接口,它就可以跟許多泛型算法以及依賴(lài)于改接口的集合實(shí)現(xiàn)進(jìn)行協(xié)作。你付出很小的努力就可以獲得非常強(qiáng)大的功能。

  事實(shí)上,Java平臺(tái)類(lèi)庫(kù)中的所有值類(lèi)都實(shí)現(xiàn)了Comparable接口。如果你正在編寫(xiě)一個(gè)值類(lèi),它具有非常明顯的內(nèi)在排序關(guān)系,比如按字母順序、按數(shù)值順序或者按年代順序,那你就應(yīng)該堅(jiān)決考慮實(shí)現(xiàn)這個(gè)接口。

  compareTo方法不但允許進(jìn)行簡(jiǎn)單的等同性進(jìn)行比較,而且語(yǔ)序執(zhí)行順序比較,除此之外,它與Object的equals方法具有相似的特征,它還是一個(gè)泛型。類(lèi)實(shí)現(xiàn)了Comparable接口,就表明它的實(shí)例具有內(nèi)在的排序關(guān)系,為實(shí)現(xiàn)Comparable接口的對(duì)象數(shù)組進(jìn)行排序就這么簡(jiǎn)單: Arrays.sort(a);

  對(duì)存儲(chǔ)在集合中的Comparable對(duì)象進(jìn)行搜索、計(jì)算極限值以及自動(dòng)維護(hù)也同樣簡(jiǎn)單。列如,下面的程序依賴(lài)于String實(shí)現(xiàn)了Comparable接口,它去掉了命令行參數(shù)列表中的重復(fù)參數(shù),并按字母順序打印出來(lái):

public class WordList{
  public static void main(String args[]){
    Set<String> s = new TreeSet<String>();
    Collections.addAll(s,args);
    System.out.println(s);
  }
}

  Comparable 是排序接口;若一個(gè)類(lèi)實(shí)現(xiàn)了 Comparable 接口,就意味著 “該類(lèi)支持排序”。而 Comparator 是比較器;我們?nèi)粜枰刂颇硞€(gè)類(lèi)的次序,可以建立一個(gè) “該類(lèi)的比較器” 來(lái)進(jìn)行排序。

  前者應(yīng)該比較固定,和一個(gè)具體類(lèi)相綁定,而后者比較靈活,它可以被用于各個(gè)需要比較功能的類(lèi)使用??梢哉f(shuō)前者屬于 “靜態(tài)綁定”,而后者可以 “動(dòng)態(tài)綁定”。

  我們不難發(fā)現(xiàn):Comparable 相當(dāng)于 “內(nèi)部比較器”,而 Comparator 相當(dāng)于 “外部比較器”。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java項(xiàng)目Guava包?HashMultimap使用及注意事項(xiàng)

    Java項(xiàng)目Guava包?HashMultimap使用及注意事項(xiàng)

    guava基本上可以說(shuō)是java開(kāi)發(fā)項(xiàng)目中,大概率會(huì)引入的包,今天介紹的主角是一個(gè)特殊的容器HashMultmap,可以簡(jiǎn)單的將它的數(shù)據(jù)結(jié)構(gòu)理解為Map<K,?Set<V>>,今天主要介紹下基礎(chǔ)的知識(shí)點(diǎn)?HashMultmap級(jí)使用,感興趣的朋友一起看看吧
    2022-05-05
  • Java Stream 流的使用過(guò)程解析

    Java Stream 流的使用過(guò)程解析

    這篇文章主要介紹了Java Stream 流的使用過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java?常量池詳解之字符串常量池實(shí)現(xiàn)代碼

    Java?常量池詳解之字符串常量池實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java?常量池詳解之字符串常量池,本文結(jié)合示例代碼對(duì)java字符串常量池相關(guān)知識(shí)講解的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Springboot中的Controller解析

    Springboot中的Controller解析

    這篇文章主要介紹了Springboot中的Controller解析,Controller是SpringBoot的基本組件,也是MVC結(jié)構(gòu)的組成部分,其作用是將用戶(hù)提交來(lái)的請(qǐng)求通過(guò)URL匹配,分發(fā)給不同的接收器,該接收器會(huì)對(duì)其進(jìn)行相應(yīng)處理,然后返回處理結(jié)果,需要的朋友可以參考下
    2023-09-09
  • java中有無(wú)參數(shù)和返回值的方法詳解

    java中有無(wú)參數(shù)和返回值的方法詳解

    這篇文章主要介紹了java中有無(wú)參數(shù)和返回值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺談java中OO的概念和設(shè)計(jì)原則(必看)

    淺談java中OO的概念和設(shè)計(jì)原則(必看)

    下面小編就為大家?guī)?lái)一篇淺談java中OO的概念和設(shè)計(jì)原則(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java數(shù)組優(yōu)點(diǎn)和缺點(diǎn)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java數(shù)組優(yōu)點(diǎn)和缺點(diǎn)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    本文給大家簡(jiǎn)單介紹下java數(shù)組的優(yōu)點(diǎn)和缺點(diǎn)知識(shí),需要的的朋友參考下吧
    2017-04-04
  • 詳解SpringMVC使用MultipartFile實(shí)現(xiàn)文件的上傳

    詳解SpringMVC使用MultipartFile實(shí)現(xiàn)文件的上傳

    本篇文章主要介紹了SpringMVC使用MultipartFile實(shí)現(xiàn)文件的上傳,本地的文件上傳到資源服務(wù)器上,比較好的辦法就是通過(guò)ftp上傳。這里是結(jié)合SpringMVC+ftp的形式上傳的,有興趣的可以了解一下。
    2016-12-12
  • mall整合SpringSecurity及JWT認(rèn)證授權(quán)實(shí)戰(zhàn)下

    mall整合SpringSecurity及JWT認(rèn)證授權(quán)實(shí)戰(zhàn)下

    這篇文章主要為大家介紹了mall整合SpringSecurity及JWT認(rèn)證授權(quán)實(shí)戰(zhàn)第二篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • SpringCloud OpenFeign自定義結(jié)果解碼器方式

    SpringCloud OpenFeign自定義結(jié)果解碼器方式

    這篇文章主要介紹了SpringCloud OpenFeign自定義結(jié)果解碼器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

双鸭山市| 岳西县| 泰兴市| 南召县| 杭锦后旗| 玉树县| 盐源县| 延津县| 牟定县| 库伦旗| 吴江市| 晋江市| 和平县| 色达县| 麻栗坡县| 禹城市| 遵义县| 隆子县| 云龙县| 土默特左旗| 漯河市| 同仁县| 德庆县| 镇安县| 叶城县| 开化县| 宽甸| 彰化市| 西贡区| 华蓥市| 金寨县| 宾川县| 乌审旗| 湖口县| 安平县| 乡宁县| 嵩明县| 河曲县| 开封县| 堆龙德庆县| 砀山县|