《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法
? ? 散列碼( hash code ) 是由對象導出的一個整型值。散列碼是沒有規律的。如果 x 和 y 是兩個不同的對象, x.hashCode( ) 與 y.hashCode( ) 基本上不會相同。 在表 5- 1 中列出 T 幾個通過調用 String 類的 hashCode 方法得到的散列碼。
? ? 由于 hashCode方法定義在 Object 類中, 因此每個對象都有一個默認的散列碼,其值為對象的存儲地址。
Object 中的 hashCode 方法:
public native int hashCode(); // 原生的方法,非Java實現String 類使用下列算法計算散列碼:
// String 類中的 hashCode [JDK 1.8 ]public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}如果重新定義 equals方法,就必須重新定義 hashCode 方法, 以便用戶可以將對象插人到散列表中。
hashCode 方法應該返回一個整型數值(也可以是負數,) 并合理地組合實例域的散列碼,以便能夠讓各個不同的對象產生的散列碼更加均勻。
例如, 下面是 Employee 類的 hashCode 方法
不過,還可以做得更好。首先, 最好使用 null 安全的方法 Objects.hashCode。 如果其參數為 null,這個方法會返回 0, 否則返回對參數調用 hashCode 的結果。
public int hashCode(){return 7 * Objects.hashCode(name)+ 11 * Double.hashCode(salary)+ 13 * Objects.hashCode(hireDay) }還有更好的做法,需要組合多個散列值時,可以調用 ObjeCtS.hash 并提供多個參數。這個方法會對各個參數調用Objects.hashCode, 并組合這些散列值。這樣 Employee.hashCode 方法可以簡單地寫為:
public int hashCode(){return Objects.hash(name, salary, hireDay); }Equals 與 hashCode 的定義必須一致:如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必須與 y.hashCode( ) 具有相同的值。例如, 如果用定義的 Employee.equals 比較雇員的 ID,那么 hashCode 方法就需要散列 ID,而不是雇員的姓名或存儲地址。
提示:如果存在數組類型的域, 那么可以使用靜態的 Arrays.hashCode 方法計算一個散列碼,這個散列碼由數組元素的散列碼組成。
java.util.Object 1.0
? ? ?int hashCode( )
? ? 返回對象的散列碼。散列碼可以是任意的整數, 包括正數或負數。兩個相等的對象要求返回相等的散列碼。
java.util.Objects 7
? ? ?static int hash(Object . .. objects)
? ? 返回一個散列碼,由提供的所有對象的散列碼組合而得到。
? ? ?static int hashCode(Object a )
? ? 如果 a 為 null 返回 0, 否則返回 a.hashCode() 0
java.lang.(lnteger|Long|Short|Byte|Double|Float|Character|Boolean) 1.0
? ? ?static int hashCode((int11ong|short|byte|double|f1oat|char|boolean) value) 8
? ? 返回給定值的散列碼。
java.utii.Arrays 1.2
? ? ?static int hashCode(type[] a ) 5.0
? ? 計算數組 a 的散列碼。組成這個數組的元素類型可以是 object,int,long, short, char,byte, boolean, float 或 double。
總結
以上是生活随笔為你收集整理的《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java 核心技术卷1 第10版》学习
- 下一篇: 《Java 核心技术卷1 第10版》学习