equals()、hashCode()和toString()

最近在補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 (這是我看到過的最詳細,最清晰的解析)
相關文章
相關標籤/搜索