帶我重新認識HashCode和equals

2021-09-12 10:28:00 字數 1435 閱讀 9352

介紹一下equals

equals  比較兩個物件是不是相同,問題來了,equals比較的是位址,引用,這也是最準確的方法。

介紹一下hashcode

hashcode() 返回的是當前物件的實體地址轉換成的乙個int型別資料,看清楚這裡是轉換,不是等於。所以不能唯一確定物件是不是同乙個物件。

他們之間的關係. 看到了嗎,區域就是hashcode  每乙個值就是equals

你再問為什麼要這樣,equals乙個乙個進行比較會不會類似,首先我們計算出hashcode值,然後在同乙個hashcode裡面進行equals遍歷物件,找到那個相等的物件。

至於我們為什麼要重寫hashcode equals 我就不說了。

//2019 03.26  15:07

之前說不寫為什麼要重寫hashcode和equals , 我錯了,聽到阿里大佬說他被面到了這個問題。我還是在寫一遍吧。

首先根據前面的了解,hashcode 是乙個非常迅速的過程,而equals則是乙個比較慢的過程。

我們去比較兩個物件是不是相等,步驟

1、首先比較一下兩個物件的hashcode是不是相等,如果不相等的話,return false;

2、如果相等的話,那就再比較兩個equals,則時候如果不相等的話,那就return false; 相等  return true;

如果你要是不相信的話,我就帶你走一遍源**咯。下面是hashset的 contain()的源**。

看看map裡面是不是有這個key

public boolean contains(object o)
public boolean containskey(object key)
看到沒,hash(key)  再看一下hash()這個方法 那個hashcode()就是乙個本地方法

static final int hash(object key)
然後我們再回去看一下 getnode()方法 

final nodegetnode(int hash, object key)  while ((e = e.next) != null);}}

return null;

}

額,**太多 可能看不下去了 ,hash就是我們獲取的hash值,然後這段**的意思就是我那個意思,如果找到了hash值相同的物件,那麼就在equals一下, 如果存在的話 那就把那個物件return 回去,如果不存在 那就return null   收工。

這句話要記到。

同一物件在執行期間若已經儲存在集合中,則不能修改影響hashcode值的相關資訊,否則會導致記憶體洩露問題。

重新認識container

我還清楚的記得,第一次從 那兒聽說container這個詞 結果他給我解釋了半天還是似懂非懂的。今天,偷閒翻了下posa4,發現裡面對container的解釋特別清楚。粗略的理解下來是,為了分離關注點,而實現的對系統資源的封裝。豁然開朗的發現,os就是應用程式的container。突發奇想的,開發乙...

重新認識測試

以前總覺得測試是軟體開發的邊緣職位,開發人員才是軟體生命週期的核心人員。隨著對網際網路公司的了解,逐步了解到測試的重要性。以bat為例,三家公司均設定了測試開發工程師崗位,該崗位的主要職責就是編寫自動化測試案例,通過對 的邏輯進行分析,設計出能夠覆蓋大部分 的測試用例。如阿里的測試開發工程師的崗位描...

重新認識ARC

雖然用了很久的arc,感受了 簡潔。但是對arc底層實現並不了解。今天抽空研究了下,做些簡單地總結。一 strong 1.區域性變數 對於區域性變數來說,在超出作用域的地方由編譯器自動插入release。大概轉化為 在非arc返回的autorelease型別的方法 在blog手碼大概 如有錯誤還望指...