欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Comparable及Comparator接口區(qū)別詳解

 更新時間:2020年07月01日 10:46:07   作者:等你的夏天  
這篇文章主要介紹了Java Comparable及Comparator接口區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

在實(shí)際應(yīng)用中,我們往往有需要比較兩個自定義對象大小的地方。而這些自定義對象的比較,就不像簡單的整型數(shù)據(jù)那么簡單,它們往往包含有許多的屬性,我們一般都是根據(jù)這些屬性對自定義對象進(jìn)行比較的。所以Java中要比較對象的大小或者要對對象的集合進(jìn)行排序,需要通過比較這些對象的某些屬性的大小來確定它們之間的大小關(guān)系。

一般,Java中通過接口實(shí)現(xiàn)兩個對象的比較,比較常用就是Comparable接口和Comparator接口。首先類要實(shí)現(xiàn)接口,并且使用泛型規(guī)定要進(jìn)行比較的對象所屬的類,然后類實(shí)現(xiàn)了接口后,還需要實(shí)現(xiàn)接口定義的比較方法(compareTo方法或者compare方法),在這些方法中傳入需要比較大小的另一個對象,通過選定的成員變量與之比較,如果大于則返回1,小于返回-1,相等返回0。

一般簡單的回答可以這么說:

1)首先這兩個接口一般都是用來實(shí)現(xiàn)集合內(nèi)的排序,comparable還可以用于兩個對象大小的比較。

2)Comparable接口在java.lang包下面。里面有一個compareTo(T)接口方法。當(dāng)一個類需要比較的時候,需自行實(shí)現(xiàn)Comparable接口的CompareTo方法。當(dāng)調(diào)用集合排序方法的時候,就會調(diào)用對象的compareTo()方法來實(shí)現(xiàn)對象的比較。

3)Comparator接口在java.util包下面。Comparator是一個比較器接口,一般單獨(dú)定義一個比較器實(shí)現(xiàn)該接口中的比較方法compare();在集合sort方法中傳入對應(yīng)的比較器實(shí)現(xiàn)類。一般使用匿名內(nèi)部類來實(shí)現(xiàn)比較器。

4)Comparator相對于Comparable來說更加的靈活,耦合度低。

首先呢,我們可以先了解一下List是如何排序的,我通過寫一個例子來說明;

先寫一個實(shí)體類;

public class User {
  private String name;
  private Integer age;
  public static void main(String[] args) {
    List<User> users=new ArrayList<>();
    users.add(new User("yao",19));
    users.add(new User("zhang",20));
    users.add(new User("li",17));
    users.add(new User("xu",15));
    users.add(new User("xupeng",15));
    users.sort(new UserComparator());
    System.out.println(users);
  }
  public User(){

  }
  public User(String name, Integer age) {
    this.name = name;
    this.age = age;
  }
  @Override
  public String toString() {
    return "User{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
}

再寫一個實(shí)現(xiàn)比較器接口的類方法;

/**
 * 實(shí)現(xiàn)比較器接口,并重寫compare方法
 */
public class UserComparator implements Comparator<User> {
  @Override
  public int compare(User o1, User o2) {
    int age=o1.getAge()- o2.getAge();
    return age!=0?age:o1.getName().length()-o2.getName().length();
  }
}

最后,我們的測試結(jié)果是這樣的,說明成功了;

一、Comparable接口

1)什么是Comparable接口:

此接口強(qiáng)行對實(shí)現(xiàn)它的每個類的對象進(jìn)行整體排序。此排序被稱為該類的自然排序 ,類的 compareTo方法被稱為它的自然比較方法 。實(shí)現(xiàn)此接口的對象列表(和數(shù)組)可以通過 Collections.sort(和 Arrays.sort )進(jìn)行自動排序。實(shí)現(xiàn)此接口的對象可以用作有序映射表中的鍵或有序集合中的元素,無需指定比較器。

2)實(shí)現(xiàn)什么方法:

int compareTo(T o)

比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負(fù)整數(shù)、零或正整數(shù)。

參數(shù): o - 要比較的對象。

返回:負(fù)整數(shù)、零或正整數(shù),根據(jù)此對象是小于、等于還是大于指定對象。

拋出:ClassCastException - 如果指定對象的類型不允許它與此對象進(jìn)行比較。

3)實(shí)例(注:代碼基本上只改動我圈出來的即可測試,其它的照List排序的元代碼使用即可測試出結(jié)果):

當(dāng)前對象 this與傳入的其他對應(yīng)的比較方法時;

二、Comparator接口

1)實(shí)例說明:

Comparator接口與Comparable接口不同的是:

①Comparator位于包java.util下,而Comparable位于包java.lang下。

②Comparable接口將比較代碼嵌入需要進(jìn)行比較的類的自身代碼中,而Comparator接口在一個獨(dú)立的類中實(shí)現(xiàn)比較。

③comparator接口相對更靈活些,因?yàn)樗涌趯?shí)現(xiàn)的類是耦合在一起的,可以通過換比較器來換不同的規(guī)則進(jìn)行比較,即如果前期類的設(shè)計(jì)沒有考慮到類的Compare問題而沒有實(shí)現(xiàn)Comparable接口,后期可

以通過Comparator接口來實(shí)現(xiàn)比較算法進(jìn)行排序,并且為了使用不同的排序標(biāo)準(zhǔn)做準(zhǔn)備,比如:升序、降序。

④Comparable接口強(qiáng)制進(jìn)行自然排序,而Comparator接口不強(qiáng)制進(jìn)行自然排序,可以指定排序順序。

⑤換一種說法,簡單的說:

Comparable:使user類具有自比較的能力,可以讓自己跟同類型的數(shù)據(jù)做比較;

Comparator:就是一個比較器,像一個第三方,傳入兩個對象,讓比較器去判斷誰大誰??;

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 8中map()和flatMap()方法區(qū)別詳解

    Java 8中map()和flatMap()方法區(qū)別詳解

    這篇文章主要為大家介紹了Java 8中map()和flatMap()方法區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Spring執(zhí)行流程和Bean的生命周期詳解

    Spring執(zhí)行流程和Bean的生命周期詳解

    這篇文章主要介紹了Spring執(zhí)行流程和Bean的生命周期詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • java中dart類詳細(xì)講解

    java中dart類詳細(xì)講解

    這篇文章主要介紹了dart類詳細(xì)講解,實(shí)例講解的很清晰,有對于這方面不太清楚的同學(xué)可以跟著學(xué)習(xí)下
    2021-02-02
  • spring boot 監(jiān)控處理方案實(shí)例詳解

    spring boot 監(jiān)控處理方案實(shí)例詳解

    這篇文章主要介紹了spring boot 監(jiān)控處理方案的相關(guān)資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • 關(guān)于java的包Package中同名類的沖突及其理解

    關(guān)于java的包Package中同名類的沖突及其理解

    這篇文章主要介紹了關(guān)于java的包Package中同名類的沖突及其理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 流式圖表拒絕增刪改查之kafka核心消費(fèi)邏輯上篇

    流式圖表拒絕增刪改查之kafka核心消費(fèi)邏輯上篇

    這篇文章主要為大家介紹了流式圖表拒絕增刪改查之kafka核心消費(fèi)邏輯詳解的上篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式

    Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式

    這篇文章主要介紹了Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中File、Base64、MultipartFile之間相互轉(zhuǎn)換的代碼詳解

    Java中File、Base64、MultipartFile之間相互轉(zhuǎn)換的代碼詳解

    File、Base64和MultipartFile都是在編程中常用的類或者數(shù)據(jù)類型,用于處理文件和數(shù)據(jù)的存儲、傳輸和轉(zhuǎn)換等操作,本文將給大家介紹了Java中File、Base64、MultipartFile之間相互轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • 詳解怎么用Java的super關(guān)鍵字

    詳解怎么用Java的super關(guān)鍵字

    今天帶大家學(xué)習(xí)Java中super關(guān)鍵字是怎么用的,文中有非常詳細(xì)的介紹,對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 詳解Spring cloud使用Ribbon進(jìn)行Restful請求

    詳解Spring cloud使用Ribbon進(jìn)行Restful請求

    這篇文章主要介紹了詳解Spring cloud使用Ribbon進(jìn)行Restful請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論