zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          hashcode,一個不太好理解,也常被我們忽視的一個概念。然而,hashcode還有對我們有用的東西。
          java給我們提供了兩種判斷對象對等的方式。如果我們判斷兩個對象是否相等,那么直接用“==”運算就可以了。然而,判斷兩個對象對等,就沒有那么簡單了。
          在java中,我們常常通過equals()方法來判斷兩個對象的對等。其實,我么還可以通過hashCode()來判斷兩個對象的對等。

          看下面的例子:

          import java.util.List;

          public class MyBag{
          ??? float money;
          ??? List books;??
          }
          我們如何判斷兩個MyBag對象是對等的呢?也就是說,如果有兩個MyBag的對象bag1和bag2,通過什么的辦法能說明這個兩個對象是相同的呢?
          先聲名兩個概念:
          兩個對象相等,指的是,兩個引用指向了同一個對象,也就是說,指向了內存中的同一個地址。
          兩個對象相同(對等),指得是兩個對象的任何屬性都相等,但是,不是一個對象。

          所以,對于上面的MyBag的對象對等,那么,兩個對象的money要一樣,同時,books要對等。那么如何去判斷呢?我們通常會自己去實現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;
          ??? }

          我們也可以通過實現hashCode()來實現:
          ??? 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;
          ??? }

          那么我們判斷兩個對象對等時,就可以這樣來實現了:
          if(bag1.equals(bag2)){
          ??? // 對等
          }

          或者
          if(bag1.haseCode()==bag2.hashCode()){
          ??? // 對等
          }

          為什么這種方式也能判斷兩個對象對等呢?
          因為,任何一個對象的hashCode是唯一的,并且和氣對象屬性按照一定的規則相關的。

          比如,一個Integer的hashCode值就是其整數值,因為Integer的haseCode()是這樣實現的:
          ??? public int hashCode() {
          ??? ??? return value;
          ??? }
          ??? public boolean equals(Object obj) {
          ??? ??? if (obj instanceof Integer)
          ??? ??? ??? return value == ((Integer) obj).intValue();
          ??? ??? else
          ??? ??? ??? return false;
          ??? }

          由此可以看到,也對象的HashCode是和其屬性有一定的聯系,規則和屬性的值有一定的聯系,這個規則決定了有相同的hashcode,就有兩個對象的屬性對等。



          |----------------------------------------------------------------------------------------|
                                     版權聲明  版權所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2008-04-22 18:03 zhyiwww 閱讀(1386) 評論(1)  編輯  收藏 所屬分類: java basic

          FeedBack:
          # re: 對hashCode的一點簡單認識
          2008-04-23 16:48 | 懶人
          那hashtable是什么用的?  回復  更多評論
            
          主站蜘蛛池模板: 会理县| 沅江市| 嘉善县| 友谊县| 马山县| 吉林省| 武强县| 荆门市| 巫溪县| 天台县| 南丰县| 都匀市| 色达县| 大厂| 青河县| 牡丹江市| 邵阳县| 浮梁县| 长兴县| 丰台区| 宾川县| 昭平县| 德安县| 天长市| 突泉县| 清徐县| 泸西县| 海城市| 陇南市| 临沧市| 通州区| 瑞丽市| 包头市| 灵宝市| 来安县| 松滋市| 绥宁县| 乐至县| 璧山县| 永寿县| 红河县|