国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java提高篇(三八)-----Java集合細節(四):保持compareTo和equals同步

2019-11-14 20:47:37
字體:
來源:轉載
供稿:網友
java提高篇(三八)-----Java集合細節(四):保持compareTo和equals同步

在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 = 0index2 = 1

為什么會產生這樣不同的結果呢?這是因為indexOf和binarySearch的實現機制不同,indexOf是基于equals來實現的只要equals返回TRUE就認為已經找到了相同的元素。而binarySearch是基于compareTo方法的,當compareTo返回0 時就認為已經找到了該元素。在我們實現的Student類中我們覆寫了compareTo和equals方法,但是我們的compareTo、equals的比較依據不同,一個是基于age、一個是基于name。比較依據不同那么得到的結果很有可能會不同。所以知道了原因,我們就好修改了:將兩者之間的比較依據保持一致即可。

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

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

 

參考文獻:編寫高質量代碼:改善Java程序的151個建議


-----原文出自:http://cmsblogs.com/?p=1242,請尊重作者辛勤勞動成果,轉載說明出處.

-----個人站點:http://cmsblogs.com


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷州市| 洛川县| 恩平市| 永安市| 南昌县| 元谋县| 始兴县| 武清区| 武乡县| 永吉县| 台北县| 兖州市| 社旗县| 正镶白旗| 山丹县| 建德市| 固始县| 瓮安县| 民丰县| 呼和浩特市| 大渡口区| 枣阳市| 曲沃县| 临沭县| 通河县| 房产| 南木林县| 宜春市| 营山县| 华安县| 桃源县| 汉阴县| 霸州市| 张北县| 班玛县| 同仁县| 朔州市| 浑源县| 洛宁县| 鹤山市| 黄山市|