1. 程式人生 > >第8條:改寫equals時總是要改寫hashCode

第8條:改寫equals時總是要改寫hashCode

int java.lang.Object.hashCode()

Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

The general contract of hashCode is:

  • Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode
    method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
  • If two objects are equal according to the equals(Object)
    method, then calling the hashCode method on each of the two objects must produce the same integer result.
  • It is not required that if two objects are unequal according to the method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

在每個改寫了equals的類中,你必須也要改寫hashCode方法,因為相等的物件必須具有相等的雜湊碼hashCode。

例如:

類java.lang.String重寫了equals方法,那麼其hashCode方法也必須修改。

相關推薦

讀書筆記-《Effective Java》9覆蓋equals覆蓋hashCode

如果覆蓋equals方法卻不覆蓋hashCode方法,那麼就很有可能出現兩個物件equals方法返回true,但hashCode卻不一致的情況,例如:在HashMap中取不到正確的value。 HashMap的get方法是用hashCode匹配的。 public V get(Obje

讀書筆記-《Effective Java》8覆蓋equals請遵守通用約定

如果覆蓋equals方法的目的是判斷物件之間是否相等,那麼使用超類(Object)的方法即可。 public boolean equals(Object obj) { return (this == obj); } 在覆蓋equals方法的時候,必須要遵守它的通用約

8改寫equals總是改寫hashCode

int java.lang.Object.hashCode() Returns a hash code value for the object. This method is supported for the benefit of hashtables such as

8改寫equals總是改寫hashCode

一個很常見的錯誤根源在於沒有改寫hashCode方法。在每一個改寫了equals的方法的類中,你必須也要改寫hashCode方法。如果不這麼做的話,就會違反Object.hashCode的通用約定,從而導致該類無法與所有基於雜湊值(hash)的集合類結合在一起正常執行,這樣的

Java效能優化(8):改寫equals總是改寫hashCode

一個很常見的錯誤源於沒有改寫hashCode方法。在每個改寫了equals方法的類中,你必須也要改寫hashCode方法。如果不這樣做到話,就會違反Object.hashCode的通用約定,從而導致該類無法與所有基於雜湊值(hash)的集合類結合在一起正常運作,

覆蓋equals覆蓋hashCode

覆蓋 方法 優化 equal 出現問題 相等 equals() 一個 相同 Object條約規定:相等的對象必須具有相同的散列碼hashCode 假如將只覆蓋equals方法,沒覆蓋hashCode方法的類用於HashMap中,將會出現問題,會出現get()方法返回時不是同

effectiveJava(7)覆蓋equals覆蓋hashcode

應用 作用 java cti object effective hashmap 產生 提高 在每個覆蓋了equals方法的類中,也必須要覆蓋hashcode方法。如果不這樣做的話,就會違反Object.hashcode的通用約定,從而導致該類無法結合所有基於散列的集合一

10項重寫equals請遵守通用約定

  重寫equals方法看起來似乎很簡單,但是有許多重寫方式會導致錯誤,而且後果非常嚴重。最容易避免這類問題的辦法就是不覆蓋equals方法,在這種情況下,類的每個例項都只能與它自身相等。如果滿足了以下任何一個條件,那就是正確的做法: 類的每個例項都是唯一的。 對於代表活動實體而不是值(value)的類來說

【Java實戰】原始碼解析為什麼覆蓋equals方法覆蓋hashCode方法

1、背景知識本文程式碼基於jdk1.8分析,《Java程式設計思想》中有如下描述:另外再看下Object.java對hashCode()方法的說明:/** * Returns a hash code value for the object. This method

java覆蓋equals()方法覆蓋hashCode()

我們再用JAVA建立自己的類的時候,一種比較常見的覆蓋就是覆蓋Object中的equals()方法和hashCode()方法。如果不這樣做的話,就很可能違反Object.hashCode()的通用約定,從而在利用自己建的類構建需要Hash化的集合的正常工作。其中有一條約定很

重寫equals()為什麼重寫hashCode()

重寫hashCode()時最重要的原因就是:無論何時,對同一個物件呼叫hashCode()都應該生成同樣的值。如果在將一個物件用put()方法新增進HashMap時產生一個hashCode()值,而用get()取出時卻產生了另外一個 hashCode()值,那麼就無法重新取得該物件了。所以,

2遇到多個構造器引數考慮用構造器

一、靜態工廠和構造器有個共同的侷限性:它們都不能很好地擴充套件到大量的可選引數。 二、重疊構造器模式可行,但是當有許多引數的時候,客戶端程式碼會很難編寫,並且仍然較難以閱讀—— Demo: 三、遇

讀書筆記-《Effective Java》2遇到多個構造器引數考慮用構建器

當一個類有很多個屬性時,建立物件的時候要麼就先建立個物件然後給物件賦值,要麼就根據業務需要寫很多個構造器, 這樣的構造器可讀性差。就算用靜態工廠也得寫很多個,這時候就可以用構建器了。 例如: package org.test; public class People { pr

10謹慎地改寫clone

/** * A class implements the <code>Cloneable</code> interface to * indicate to the {@link java.lang.Object#clone()} method

2遇到多個構造器引數考慮用構建器

靜態工廠和構造器有個共同的侷限性:它們都不能很好地擴充套件到大量的可選引數。考慮用一個類表示包裝食品外面顯示的營養成份標籤。這些標籤中有幾個域是必需的:每份的含量、每罐的含量以及每份的卡路里,還有超過20個可選域:總脂肪量、飽和脂肪量、轉化脂肪、膽固醇、鈉等等。

8Shell腳本歸檔與壓縮

extract config 生成 -- dir exclude 硬盤分區 txt name 第8章:Shell腳本歸檔與壓縮   定期備份不可小視,我們可以通過shell腳本來實現備份自動化。其中數據備份一般要使用到歸檔與壓縮,歸檔與壓縮對於系統

1 了解 Objective-C 語言的起源

還在 特性 只知道 程序 開發 不能 核心 nbsp 原因   馬上就要發布 Swift 4 了,自己也在學習 Swift,後面 iOS 編程估計也快是 Swift 的天下了,我卻還在這抱著一本講 OC 的書在啃,怪只能怪自己之前太懶了,按定價好幾十塊錢買的書不讀完,簡直對

網易雲課堂_C++程序設計入門(下)_8單元年年歲歲花相似– 運算符重載_8單元 - 作業2OJ編程 - 重載數組下標運算符

ref [] jna turn draw cred 超出範圍 input detail 第8單元 - 作業2:OJ編程 - 重載數組下標運算符 查看幫助 返回 溫馨提示: 1.本次作業屬於Online Judge題目,提交後由系統即時判分。 2.學生可以在

《.NET 設計規範》 8使用規範

lin add 技術 具體類 行數據 數據 align 復制 程序 第 8 章:使用規範 8.1 數組   要在公共 API 中優先使用集合,避免使用數組。   不要使用只讀的數組字段。雖然字段本身是只讀的,用戶不能修改它們,但用戶可以修改數組中的元素。   考慮使

8CSS制作導航欄

font text 需要 size 影響 rep itl over important 今天主要學習了網頁導航欄的制作。註意:引入外部CSS樣式時,如果使用background:url(../images/1.png),一定記得用..跳出當前文件夾,回到上級目錄。 一、導航