詳解java中保持compareTo和equals同步
詳解java中保持compareTo和equals同步
摘要 : 介紹重寫equlas()和comparable接口,兩者進(jìn)行不相同的判斷。從而使兩者的對(duì)應(yīng)的list.indexOf()與 Collections.binarySearch()得到的不一樣。
在Java中我們常使用Comparable接口來實(shí)現(xiàn)排序,其中compareTo是實(shí)現(xiàn)該接口方法。我們知道compareTo返回0表示兩個(gè)對(duì)象相等,返回正數(shù)表示大于,返回負(fù)數(shù)表示小于。同時(shí)我們也知道equals也可以判斷兩個(gè)對(duì)象是否相等,那么他們兩者之間是否存在關(guān)聯(lián)關(guān)系呢?
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類實(shí)現(xiàn)Comparable接口和實(shí)現(xiàn)equals方法,其中compareTo是根據(jù)age來比對(duì)的,equals是根據(jù)name來比對(duì)的。
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); }
按照常規(guī)思路來說應(yīng)該兩者index是一致的,因?yàn)樗麄儥z索的是同一個(gè)對(duì)象,但是非常遺憾,其運(yùn)行結(jié)果:
index1 = 0 index2 = 1
為什么會(huì)產(chǎn)生這樣不同的結(jié)果呢?
這是因?yàn)閕ndexOf和binarySearch的實(shí)現(xiàn)機(jī)制不同。
indexOf是基于equals來實(shí)現(xiàn)的只要equals返回TRUE就認(rèn)為已經(jīng)找到了相同的元素。
而binarySearch是基于compareTo方法的,當(dāng)compareTo返回0 時(shí)就認(rèn)為已經(jīng)找到了該元素。
在我們實(shí)現(xiàn)的Student類中我們覆寫了compareTo和equals方法,但是我們的compareTo、equals的比較依據(jù)不同,一個(gè)是基于age、一個(gè)是基于name。比較依據(jù)不同那么得到的結(jié)果很有可能會(huì)不同。
所以知道了原因,我們就好修改了:將兩者之間的比較依據(jù)保持一致即可。
對(duì)于compareTo和equals兩個(gè)方法我們可以總結(jié)為:compareTo是判斷元素在排序中的位置是否相等,equals是判斷元素是否相等,既然一個(gè)決定排序位置,一個(gè)決定相等,所以我們非常有必要確保當(dāng)排序位置相同時(shí),其equals也應(yīng)該相等。
細(xì)節(jié) : 實(shí)現(xiàn)了compareTo方法,就有必要實(shí)現(xiàn)equals方法,同時(shí)還需要確保兩個(gè)方法同步
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Java中compareTo方法使用小結(jié)
- Java中BigDecimal的equals方法和compareTo方法的區(qū)別詳析
- Java中BigDecimal比較大小的3種方法(??compareTo()、??equals()??和??compareTo()??)
- Java compareTo用法詳解
- JavaSE中compare、compareTo的區(qū)別
- Java 基礎(chǔ):string中的compareTo方法
- java compare compareTo方法區(qū)別詳解
- java compareTo和compare方法比較詳解
- java使用compareTo實(shí)現(xiàn)一個(gè)類的對(duì)象之間比較大小操作
- Java中替代equals,compareTo和toString的方法
- Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)
- JAVA中compareTo方法的使用小結(jié)
相關(guān)文章
Elasticsearch?Analyzer?內(nèi)置分詞器使用示例詳解
這篇文章主要為大家介紹了Elasticsearch?Analyzer?內(nèi)置分詞器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(26)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07java實(shí)現(xiàn)簡(jiǎn)易點(diǎn)菜器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易點(diǎn)菜器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析
這篇文章主要介紹了HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析,HashMap作為開發(fā)中常用的數(shù)據(jù)結(jié)構(gòu),也是面試中經(jīng)常被問的知識(shí)點(diǎn),因此作為開發(fā)者應(yīng)該盡可能多的理解其底層的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2023-11-11帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之2-3-4樹
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之2-3-4樹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01Java8接口中引入default關(guān)鍵字的本質(zhì)原因詳析
Default方法是在java8中引入的關(guān)鍵字,也可稱為Virtual extension methods—虛擬擴(kuò)展方法,這篇文章主要給大家介紹了關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因,需要的朋友可以參考下2022-01-01