參考與學習:
旨在通過這篇文章把現在我明白的;未來我可能忘記的以及混淆的,寫清楚。
hashcode方法
該方法定義在object類中,是native方法;
(哦我去)
其他囉嗦的我不想寫了;不懂直接去看上面兩篇部落格;(果然!)
點一:equals與==的關係和區別:
object類中定義的equals方法,就是使用了==來進行比較的;
==,比較的是物件的記憶體位址是否相同;(這個記住了啊)
點二:我的疑問點在於:
為什麼重寫equals方法,一定要重寫hashcode方法;
第一篇文章解答了我的疑惑;
當定義的類,比如說不會建立student類對應的雜湊表中,例如,沒有hashmap<\student>結構,其實在重寫equals方法時,是不需要重寫hashcode方法的。
public
class
student
public
student
(string name,
int age)
@override
public
boolean
equals
(object obj)
public
static
void
main
(string[
] args)
}
這個時候比較這兩個物件是否相等,只需要重寫了equals方法就可以了。(另外注意一下equals方法怎麼重寫的)
但如果建立了類對應的雜湊表,如hashmap<\student>,則在重寫equals方法的同時,要重寫hashcode方法;
public
class
student
public
student
(string name,
int age)
@override
public
boolean
equals
(object obj)
@override
public string tostring()
public
static
void
main
(string[
] args)
}}
執行結果:
true
name:lee age:18
name:lee age:18
發現,經equals比較,兩個物件相等;但不允許元素重複的set中卻包含了這兩個物件。造成這個問題的原因就是因為沒有重寫hashcode方法;
雜湊表在儲存元素的時候,首先根據物件的hashcode方法獲得雜湊值(基於物件的記憶體位址);這兩個物件明顯有不同的記憶體空間,所以通過hashcode獲得的雜湊值不同;hashset就會認為這是兩個不同的物件,分別儲存。
解決:
public
class
student
public
student
(string name,
int age)
@override
public
boolean
equals
(object obj)
@override
public string tostring()
@override
public
inthashcode()
public
static
void
main
(string[
] args)
}}
執行結果:
true
name:lee age:18
JAVA中hashCode的編寫
1 把某個非零常數值,比如17,儲存在乙個叫result的int型別的變數中。2 對於物件中的關鍵域f 指equals方法中考慮的每乙個域 完成以下步驟 a 為該域計算int型別的雜湊碼c i 如果該域是boolean型別,則計算 f 0 1 ii 如果該域是byte char short或者int...
java中hashcode的理解
hashcode 是幹什麼用的?2008年09月29日 星期一 07 32 p.m.首先hashcode是雜湊演算法的一中簡單實現,他是乙個物件的雜湊嗎值。一般和equals一起使用。hashcode也是用來查詢的,如果你學過資料結構就應該知道,在查詢和排序這一章有 例如記憶體中有這樣的位置 0 1...
java學習 hashCode的計算
一 常見型別的幾個案例 class people public class test 列印輸出結果 10 65 553310500 48690 people 7852e922 2018699554二 分析 1 integer型別的資料,返回的hash值為資料本身 2 物件型別的資料,返回的一串字元 ...