equals()方法code
Object類中的equals方法和「==」是同樣的,沒有區別,即倆個對象的比較是比較他們的棧內存中存儲的內存地址。而String類,Integer類等等一些類,是重寫了equals方法,才使得equals和「==不一樣」,他們比較的是值是否是相等。因此,當本身建立類時,自動繼承了Object的equals方法,要想實現不一樣的等於比較,必須重寫equals方法。對象
當咱們new一個對象時,將在內存里加載一份它本身的內存,而不是共用!對於static修飾的變量和方法則保存在方法區中,只加載一次,不會再多copy一分內存。因此咱們在判斷倆個對象邏輯上是否相等,即對象的內容是否相等不能直接使用繼承於Object類的equals()方法,咱們必須得重寫equals()方法,改變這個方法默認的實現。繼承
重寫equals方法:先判斷比較對象是否爲null—>判斷比較對象是否爲要比較類的實例—–>比較倆個成員變量是否徹底相等。內存
hashcode()方法:hash
當Set接收一個元素時根據該對象的內存地址算出hashCode,看它屬於哪個區間,再這個區間裏調用equeals方法。這裏須要注意的是:當倆個對象的hashCode值相同的時候,Hashset會將對象保存在同一個位置,可是他們equals返回false,因此實際上這個位置採用鏈式結構來保存多個對象。變量
但一個面臨問題:若兩個對象equals相等,但不在一個區間,由於hashCode的值在重寫以前是對內存地址計算得出,因此根本沒有機會進行比較,會被認爲是不一樣的對象。因此Java對於eqauls方法和hashCode方法是這樣規定的:
1. 若是兩個對象相同,那麼它們的hashCode值必定要相同。也告訴咱們重寫equals方法,必定要重寫hashCode方法,也就是說hashCode值要和類中的成員變量掛上鉤,對象相同–>成員變量相同—->hashCode值必定相同。
2. 若是兩個對象的hashCode相同,它們並不必定相同,這裏的對象相同指的是用eqauls方法比較。方法
注:若是咱們將對象的屬性值參與了hashCode的運算中,在進行刪除的時候,就不能對其屬性值進行修改,不然會出現嚴重的問題。static