91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中如何實現equals與compareTo保持同步

發布時間:2020-11-11 17:02:48 來源:億速云 閱讀:152 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關java中如何實現equals與compareTo保持同步,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

詳解java中保持compareTo和equals同步

摘要 : 介紹重寫equlas()和comparable接口,兩者進行不相同的判斷。從而使兩者的對應的list.indexOf()與 Collections.binarySearch()得到的不一樣。

在Java中我們常使用Comparable接口來實現排序,其中compareTo是實現該接口方法。我們知道compareTo返回0表示兩個對象相等,返回正數表示大于,返回負數表示小于。同時我們也知道equals也可以判斷兩個對象是否相等,那么他們兩者之間是否存在關聯關系呢?

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

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

  public boolean equals(Object obj){
    if(obj == null){
      return false;
    }

    if(this == obj){
      return true;
    }

    if(obj.getClass() != this.getClass()){
      return false;
    }

    Student student = (Student)obj;
    if(!student.getName().equals(getName())){
      return false;
    }

    return true;
  }

  public int compareTo(Student student) {
    return this.age - student.age;
  }

  /** 省略getter、setter方法 */
}

Student類實現Comparable接口和實現equals方法,其中compareTo是根據age來比對的,equals是根據name來比對的。

public static void main(String[] args){
    List<Student> list = new ArrayList<>();
    list.add(new Student("1", "chenssy1", 24));
    list.add(new Student("2", "chenssy1", 26));

    Collections.sort(list);  //排序

    Student student = new Student("2", "chenssy1", 26);

    //檢索student在list中的位置
    int index1 = list.indexOf(student);
    int index2 = Collections.binarySearch(list, student);

    System.out.println("index1 = " + index1);
    System.out.println("index2 = " + index2);
  }

按照常規思路來說應該兩者index是一致的,因為他們檢索的是同一個對象,但是非常遺憾,其運行結果:

index1 = 0

index2 = 1

為什么會產生這樣不同的結果呢?

這是因為indexOf和binarySearch的實現機制不同。

indexOf是基于equals來實現的只要equals返回TRUE就認為已經找到了相同的元素。

而binarySearch是基于compareTo方法的,當compareTo返回0 時就認為已經找到了該元素。

在我們實現的Student類中我們覆寫了compareTo和equals方法,但是我們的compareTo、equals的比較依據不同,一個是基于age、一個是基于name。比較依據不同那么得到的結果很有可能會不同。

所以知道了原因,我們就好修改了:將兩者之間的比較依據保持一致即可。

對于compareTo和equals兩個方法我們可以總結為:compareTo是判斷元素在排序中的位置是否相等,equals是判斷元素是否相等,既然一個決定排序位置,一個決定相等,所以我們非常有必要確保當排序位置相同時,其equals也應該相等。

細節 : 實現了compareTo方法,就有必要實現equals方法,同時還需要確保兩個方法同步

以上就是java中如何實現equals與compareTo保持同步,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

公主岭市| 石河子市| 宕昌县| 岳西县| 宝应县| 尚义县| 商洛市| 东平县| 盖州市| 高陵县| 上栗县| 祥云县| 杭州市| 罗平县| 锡林郭勒盟| 许昌县| 大埔县| 靖州| 喀喇沁旗| 祁东县| 米泉市| 鄂尔多斯市| 施甸县| 鄂温| 莎车县| 平顺县| 文成县| 泸定县| 冕宁县| 塔河县| 庆安县| 江城| 镇远县| 拉萨市| 金华市| 武安市| 尼玛县| 尚志市| 宜宾县| 廊坊市| 龙山县|