zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0
          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   
          |----------------------------------------------------------------------------------------|
          posted on 2008-04-22 18:03 zhyiwww 閱讀(1387) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): java basic

          FeedBack:
          # re: 對(duì)hashCode的一點(diǎn)簡(jiǎn)單認(rèn)識(shí)
          2008-04-23 16:48 | 懶人
          那hashtable是什么用的?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 天祝| 鹿泉市| 铅山县| 台前县| 宁都县| 宜兰县| 闽清县| 惠安县| 梧州市| 浦北县| 隆回县| 武义县| 信丰县| 宝山区| 吴川市| 高要市| 定襄县| 和顺县| 大英县| 宝山区| 德保县| 武乡县| 黑水县| 西乌珠穆沁旗| 芒康县| 曲阜市| 无极县| 德州市| 花莲县| 安陆市| 稷山县| 修武县| 岐山县| 固安县| 莆田市| 厦门市| 湖口县| 北票市| 宣城市| 哈尔滨市| 福州市|