天天看點

Java集合之保持compareTo和equals同步

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

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

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

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

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

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

本文轉載自:http://cmsblogs.com/?p=1242