hashcode,一個(gè)不太好理解,也常被我們忽視的一個(gè)概念。然而,hashcode還有對(duì)我們有用的東西。
java給我們提供了兩種判斷對(duì)象對(duì)等的方式。如果我們判斷兩個(gè)對(duì)象是否相等,那么直接用“==”運(yùn)算就可以了。然而,判斷兩個(gè)對(duì)象對(duì)等,就沒(méi)有那么簡(jiǎn)單了。
在java中,我們常常通過(guò)equals()方法來(lái)判斷兩個(gè)對(duì)象的對(duì)等。其實(shí),我么還可以通過(guò)hashCode()來(lái)判斷兩個(gè)對(duì)象的對(duì)等。
看下面的例子:
import java.util.List;
public class MyBag{
??? float money;
??? List books;??
}
我們?nèi)绾闻袛鄡蓚€(gè)MyBag對(duì)象是對(duì)等的呢?也就是說(shuō),如果有兩個(gè)MyBag的對(duì)象bag1和bag2,通過(guò)什么的辦法能說(shuō)明這個(gè)兩個(gè)對(duì)象是相同的呢?
先聲名兩個(gè)概念:
兩個(gè)對(duì)象相等,指的是,兩個(gè)引用指向了同一個(gè)對(duì)象,也就是說(shuō),指向了內(nèi)存中的同一個(gè)地址。
兩個(gè)對(duì)象相同(對(duì)等),指得是兩個(gè)對(duì)象的任何屬性都相等,但是,不是一個(gè)對(duì)象。
所以,對(duì)于上面的MyBag的對(duì)象對(duì)等,那么,兩個(gè)對(duì)象的money要一樣,同時(shí),books要對(duì)等。那么如何去判斷呢?我們通常會(huì)自己去實(shí)現(xiàn)equals()方法去判斷,方法如下:
??? public boolean equals(Object obj) {
??? ??? if (this == obj)
??? ??? ??? return true;
??? ??? if (obj == null)
??? ??? ??? return false;
??? ??? if (getClass() != obj.getClass())
??? ??? ??? return false;
??? ??? final MyBag other = (MyBag) obj;
??? ??? if (books == null) {
??? ??? ??? if (other.books != null)
??? ??? ??? ??? return false;
??? ??? } else if (!books.equals(other.books))
??? ??? ??? return false;
??? ??? if (Float.floatToIntBits(money) != Float.floatToIntBits(other.money))
??? ??? ??? return false;
??? ??? return true;
??? }
我們也可以通過(guò)實(shí)現(xiàn)hashCode()來(lái)實(shí)現(xiàn):
??? public int hashCode() {
??? ??? final int prime = 31;
??? ??? int result = 1;
??? ??? result = prime * result + ((books == null) ? 0 : books.hashCode());
??? ??? result = prime * result + Float.floatToIntBits(money);
??? ??? return result;
??? }
那么我們判斷兩個(gè)對(duì)象對(duì)等時(shí),就可以這樣來(lái)實(shí)現(xiàn)了:
if(bag1.equals(bag2)){
??? // 對(duì)等
}
或者
if(bag1.haseCode()==bag2.hashCode()){
??? // 對(duì)等
}
為什么這種方式也能判斷兩個(gè)對(duì)象對(duì)等呢?
因?yàn)椋魏我粋€(gè)對(duì)象的hashCode是唯一的,并且和氣對(duì)象屬性按照一定的規(guī)則相關(guān)的。
比如,一個(gè)Integer的hashCode值就是其整數(shù)值,因?yàn)镮nteger的haseCode()是這樣實(shí)現(xiàn)的:
??? public int hashCode() {
??? ??? return value;
??? }
??? public boolean equals(Object obj) {
??? ??? if (obj instanceof Integer)
??? ??? ??? return value == ((Integer) obj).intValue();
??? ??? else
??? ??? ??? return false;
??? }
由此可以看到,也對(duì)象的HashCode是和其屬性有一定的聯(lián)系,規(guī)則和屬性的值有一定的聯(lián)系,這個(gè)規(guī)則決定了有相同的hashcode,就有兩個(gè)對(duì)象的屬性對(duì)等。
|----------------------------------------------------------------------------------------|
版權(quán)聲明 版權(quán)所有 @zhyiwww
引用請(qǐng)注明來(lái)源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|