Java中的hashcode方法

2021-09-02 17:31:50 字數 2000 閱讀 5272

參考與學習:

旨在通過這篇文章把現在我明白的;未來我可能忘記的以及混淆的,寫清楚。

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 物件型別的資料,返回的一串字元 ...