在面試的時候不少時候會問到「==」和equals()對於不少人來講都已經很瞭解了,對於我來講彷佛和新的知識點同樣。下面就來分析一下:java
2.「equals()」面試
在做對象內容進行比較的時候顯然「==」是不行的,因此equals()方法隨之誕生了。 在基類Object中有方法equals()實現方式,此刻比較的仍然是內存地址: public boolean equals(Object paramObject) { return (this == paramObject); } 在封裝的對象類型不少都已經重寫了Object中equals方法那麼簡單看兩個: String類中的:函數
public boolean equals(Object paramObject) { if (this == paramObject) return true; if (paramObject instanceof String) { String str = (String) paramObject; int i = this.count; if (i == str.count) { char[] arrayOfChar1 = this.value; char[] arrayOfChar2 = str.value; int j = this.offset; int k = str.offset; while (i-- != 0) if (arrayOfChar1[(j++)] != arrayOfChar2[(k++)]) return false; return true; } } return false; }
String類中的equals()方法首先比較的是內存地址,而後是字符串長度,而後逐個字符進行比較。 Integer類中:this
public boolean equals(Object paramObject) { if (paramObject instanceof Integer) return (this.value == ((Integer) paramObject).intValue()); return false; }
此刻比較的也是內容,因此當咱們建立類的時候,對象作比較的時候須要重寫equals方法,由於通常若是使用java中的Map對象進行存儲時,他會自動調用hashCode方法來比較兩個對象是否相等。設計
3.「hashcode()」code
因此若是咱們對equals方法進行了重寫,建議必定要對hashCode方法重寫,以保證相同的對象返回相同的hash值,不一樣的對象返回不一樣的hash值。重寫hashcode()方法的目的是提升查找效率。 設計hashCode()時最重要的因素就是:不管什麼時候,對同一個對象調用hashCode()都應該產生一樣的值。若是在講一個對象用put()添加進HashMap時產生一個hashCdoe值,而用get()取出時卻產生了另外一個hashCode值,那麼就沒法獲取該對象了。因此若是你的hashCode方法依賴於對象中易變的數據,用戶就要小心了,由於此數據發生變化時,hashCode()方法就會生成一個不一樣的散列碼。 所以必定要注意:千萬不能改變生產hashcode的相關變量,這個會形成內存泄漏,永遠get不到存放在內存中的對象。對象