最近在補Java基礎,從前一直不明白equals()、hashCode()和toString()這幾個的關係,今天看了些博文和參考《Java編程思想》,並作如下總結。編程
1)toString():.net
- (1)Object的方法;
- (2)沒被重寫的狀況下,返回堆區中Java對象的字符串表示形式(等同看作Java對象的內存地址); 在基本類型中,「==」比較的是對象的值;在非基本類型中,「==」比較的是對象的實際存儲的內存地址。
2)equals():code
- (1)Object的方法;
- (2)沒被重寫的狀況下, equals默認狀況下內部就是「==」比較;
3)hashCode():對象
- (1)Object的方法;
- (2)在object類中,hashcode()返回的是對象的地址值,
- (3)而object類中的equals()方法比較的也是兩個對象的地址值,若是equals()相等,說明兩個對象地址值也相等,固然hashcode() 也就相等了;
4)解析爲何「當重寫一個對象的equals方法,就必須重寫他的hashCode方法?」 簡答:像在HashSet當中,是不容許兩個相同的對象插入集合中的。在HashSet在插入對象時,通過如下步驟:blog
- (1)首先是經過預插入對象的hashCode判斷插入對象屬於hash列表的哪個隊列中。
- (2)找到線性隊列後,再經過equals()方法和線性隊列中的元素作比較。 假設有一個類重寫了equals()方法,而沒重寫hashCode()方法,這個類有兩個對象,分別是a和b,其中a.equals(b) == true,如今要在Hashset中插入a和b對象。則在將這兩個對象插入HashSet中時,a對象和b象的hashCode不一樣(不一樣對象的地址不一樣,全部hashCode也不一樣),則計算獲得hash隊列頗有可能不一樣(步驟1),這時再用equals()方法去和線性隊列中的元素去比較時(步驟2),天然沒有相等的元素,這時a和b對象都插入了HashSet中。這違背的HashSet規則。因此,當重寫一個對象的equals方法,就必須重寫他的hashCode方法,這樣才能保證equals()方法相同時,hashCode()也必定相同。 更詳細的equals()和hashCode()解析,參考: http://blog.csdn.net/jiangwei0910410003/article/details/22739953 (這是我看到過的最詳細,最清晰的解析)