Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評(píng)論 :: 0 Trackbacks

          hashCode:
          他是用來產(chǎn)生hash值的,用在Hashtable上,也包括HashMap等實(shí)現(xiàn)。
          hashCode的基本約定是:
          1、hashCode方法在同一個(gè)object上不管被調(diào)用了多少次,在同一次執(zhí)行的Java程序中,hashCode方法必須返回一個(gè)持續(xù)相同的int。在object被修改時(shí),不給equals方法提供信息。這個(gè)int值在同一個(gè)程序的兩次不同執(zhí)行過程中(同一程序執(zhí)行兩次),不需要保持恒定。
          2、如果兩個(gè)object通過equals()方法判斷相等,則調(diào)用它們的hashCode方法應(yīng)該產(chǎn)生相同的結(jié)果。
          3、兩個(gè)通過equals()方法判定不相等的object,調(diào)用它們的hashCOde方法并不是必須返回不同的結(jié)果。但是,成序言們應(yīng)該意識(shí)到對(duì)于不相等的object產(chǎn)生不同的int結(jié)果有助于提升hashtables的效率。
          一般技術(shù)上,通過將object的內(nèi)部地址轉(zhuǎn)換為integer的方法來產(chǎn)生hashCode,但這不是必需的。

          equals:
          就是判斷是否相等的方法。
          基本約定如下:
          自反:就是x.equals(x)應(yīng)該返回true
          對(duì)稱:x.equals(y)返回true則y.equals(x)返回true
          傳遞:x.euqls(y)==true,y.equals(z)==true,那么x.equals(z)也必須返回true
          持續(xù)性:就是說如果x.equals(y)==true,不管它調(diào)用多少次都應(yīng)該返回true
          非空引用:x.equals(null)應(yīng)該返回false

          準(zhǔn)則原因這里:
          http://java.sun.com/j2se/1.3/docs/api/java/lang/Object.html#hashCode()

          在實(shí)際Domain中如何實(shí)現(xiàn)他們比較好呢?從eclipseWork中的模板生成如下:

          public boolean equals(Object rhs) {
                  
          if (rhs == null{
                      
          return false;
                  }


                  
          if (!(rhs instanceof Town)) {
                      
          return false;
                  }


                  Town that 
          = (Town) rhs;

                  
          if ((this.getId() == null|| (that.getId() == null)) {
                      
          return false;
                  }


                  
          return (this.getId().equals(that.getId()));
              }

          public int hashCode() {
                  
          if (this.hashValue == 0{
                      
          int result = 17;
                      
          int idValue = (this.getId() == null? 0 : this.getId().hashCode();
                      result 
          = (result * 37+ idValue;
                      
          this.hashValue = result;
                  }


                  
          return this.hashValue;
              }

          下一步還要繼續(xù)研究,上面的的方法很類似于“Java theory and practice: Hashing it out”
          http://www-128.ibm.com/developerworks/java/library/j-jtp05273.html
          posted on 2006-02-15 11:34 Tin 閱讀(634) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate相關(guān)
          主站蜘蛛池模板: 遂川县| 皋兰县| 阜宁县| 临江市| 渭源县| 湖州市| 雅安市| 边坝县| 江川县| 黄大仙区| 大荔县| 祁连县| 乐业县| 崇左市| 万源市| 胶州市| 洞头县| 吉木乃县| 延庆县| 礼泉县| 景德镇市| 太和县| 临桂县| 集安市| 登封市| 右玉县| 威海市| 博客| 闽侯县| 天峨县| 白水县| 乌什县| 鄂伦春自治旗| 博客| 高雄县| 仲巴县| 贵南县| 宾阳县| 双鸭山市| 浮梁县| 东光县|