1. 程式人生 > >【轉載】hashCode()、equals()以及compareTo()方法的理解

【轉載】hashCode()、equals()以及compareTo()方法的理解

進行 一個 terms 兩個 定義 == bject str rac

判斷兩個對象是否相等(是同一個對象),首先調用hashCode()方法得到各自的hashcode,

1、如果hashcode不相等,則表明兩個對象不相等。

2、如果hashcode相等,繼續調用equals方法進行判斷

2.1:equals()返回true,則對象相等

2.2:equals()返回fasle,兩對象不相等

所以,要求程序員在重寫hashCode方法時盡量做到:不一樣的對象,hashCode不一樣,這樣在判斷兩個對象是否是同一對象時可以提高效率。

根據這兩點,我們可以看一道常見的JAVA面試題:

題目:對於兩個對象A、B,A.equals(B)==true,不一定有相同的hashCode(); 這句話是錯誤的。

當然你自己定義的對象可以實現equals相同而hashCode不同(並不會報錯,不知道JAVA為什麽不限死),但java的Object類中規定相同的對象一定要有相同的hashCode:原話如下:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

compareTo()方法和equals()方法的關系:

對於某些對象如集合(TreeSet)需要實現內部排序,所以要實現Comparable接口,從而要實現裏面的唯一方法compareTo();實現Comparable接口的對象表明遵循自然排序。從Comparable的API中可以看出:

重寫compareTo()方法,不要求必須重寫equals()方法,但是卻強烈推薦重寫equals(),以使兩個方法的比較結果在邏輯上是一致。原話如下:

It is strongly recommended (though not required) that natural orderings be consistent with equals. This is so because sorted sets (and sorted maps) without explicit comparators behave "strangely" when they are used with elements (or keys) whose natural ordering is inconsistent with equals. In particular, such a sorted set (or sorted map) violates the general contract for set (or map), which is defined in terms of the equals

method.

所以在編寫需要用TreeSet添加的對象時,該對象一定要實現Comparable接口,並且重寫compareTo()方法,並推薦同時重寫equals()方法

原文出自:http://blog.sina.com.cn/s/blog_50d936c40100nvzz.html

【轉載】hashCode()、equals()以及compareTo()方法的理解