Be alaways javaing...

          Loving Java
          posts - 43, comments - 5, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java中equals() hashcode()方法

          Posted on 2008-08-04 14:38 追風(fēng)舞者 閱讀(199) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE

                Java語(yǔ)言中的equals的規(guī)范:

                    1. 自反性:對(duì)于任何一個(gè)非空引用xx.equals(x)應(yīng)該返回true
              2. 對(duì)稱性:對(duì)于任何引用xy,如果x.equals(y)返回true,那么y.equals(x)也應(yīng)該返回true
              3. 傳遞性:對(duì)于任何引用xyz,如果x.equals(y)返回truey.equals(z)返回true,那么x.equals(z)也應(yīng)該返回true
              4. 一致性:如果xy引用的對(duì)象沒(méi)有發(fā)生變化,那么反復(fù)調(diào)用x.equals(y)應(yīng)該返回同樣的結(jié)果。
              5. 對(duì)于任何非空引用xx.equals(null)應(yīng)該返回false

           public boolean equals(Object obj) {
            boolean result = false;
            if (this == obj)
             return true;
            if (!(obj instanceof Student))
             return false;
            Student objTemp = (Student) obj;
            if (this.getId() == objTemp.getId())
             result = true;
            return result;
           }

          Java語(yǔ)言中的hashcode:

            1. 將一個(gè)非0常數(shù),例如17,儲(chǔ)存于int result變量中。
            2. 對(duì)對(duì)象中的每一個(gè)有意義的字段f(更確切地說(shuō)是被equals()所考慮的每一個(gè)字段)進(jìn)行如下處理:
              A. 對(duì)這個(gè)字段計(jì)算出型別為int的hash 碼 c:
                i. 如果字段是個(gè)boolean,計(jì)算(f ? 0 : 1)。
                ii. 如果字段是個(gè)byte,char,short或int,計(jì)算(int)f。
                iii. 如果字段是個(gè)long,計(jì)算(int)(f^(f >>> 32))。
                iv. 如果字段是個(gè)float,計(jì)算Float.floatToIntBits(f)。
                v. 如果字段是個(gè)double,計(jì)算Double.doubleToLongBits(f),然后將計(jì)算結(jié)果按步驟2.A.iii處理。
                vi. 如果字段是個(gè)object reference,而且class 的equals()透過(guò)「遞歸呼叫equals()」的方式來(lái)比較這一字段,那么就同樣也對(duì)該字段遞歸呼叫hashCode()。
                vii. 如果字段是個(gè)array,請(qǐng)將每個(gè)元素視為獨(dú)立字段。也就是說(shuō)對(duì)每一個(gè)有意義的元素施行上述規(guī)則,用以計(jì)算出hash 碼,然后再依步驟2.B將這些數(shù)值組合起來(lái)。
              B. 將步驟A計(jì)算出來(lái)的hash碼 c按下列公式組合到變量result中:result = 37*result + c;
           3. 傳回result。
           4. 完成hashCode()之后,反躬自省一下:是否相等的實(shí)體具有相等的hash 碼?如果不是,找出原因并修正問(wèn)題。

          主站蜘蛛池模板: 白玉县| 梁河县| 台中县| 淮滨县| 滨海县| 乌什县| 上蔡县| 武功县| 安图县| 许昌市| 河池市| 平凉市| 扶风县| 普定县| 曲麻莱县| 芷江| 辛集市| 清河县| 冀州市| 深水埗区| 江北区| 黑河市| 奎屯市| 南召县| 西平县| 白山市| 乃东县| 普兰店市| 房产| 聊城市| 察哈| 白山市| 兖州市| 西青区| 嘉善县| 日照市| 汉川市| 威海市| 沙洋县| 孟州市| 西峡县|