hashCode 方法實(shí)現(xiàn)規(guī)則

          1、把某個(gè)非零常數(shù)值,比如說17,保存在一個(gè)叫result 的int 類型的變量值中。

          2、對于對象中的每一個(gè)關(guān)鍵域f (指equals 方法中考慮的每一個(gè)域),完成以下步驟:

          • 為該域計(jì)算int 類型的散列碼c:
            • 如果該域是boolean 類型,則計(jì)算(f ? 1 : 0);
            • 如果該域是byte、char、short 或者int 類型,則計(jì)算(int)f;
            • 如果該域是long 類型,則計(jì)算(int)(f ^ (f >>> 32));
            • 如果該域是float 類型,則計(jì)算Float.floatToIntBits(f);
            • 如果該域是double 類型,則計(jì)算Double.doubleToLongBits(f) 得到一個(gè)long 類型的值,然后按照步驟2.a.iii 對該long 類型計(jì)算散列值;
            • 如 果該域是一個(gè)對象引用,并且該類的equals 方法通過遞歸調(diào)用equals 的方式來比較這個(gè)域,則同樣對這個(gè)域遞歸調(diào)用hashCode 方法;如果要求一個(gè)更為復(fù)雜的比較,則為這個(gè)域計(jì)算一個(gè)“規(guī)范表示”,然后針對這個(gè)規(guī)范表示調(diào)用hashCode。如果這個(gè)域的值為null,則返回0;
            • 如果該域是一個(gè)數(shù)組,則把每一個(gè)元素當(dāng)做單獨(dú)的域來處理。然后根據(jù)步驟2.b 中的做法把這些散列值組合起來。

          • 按照下面的公式,把步驟a 中計(jì)算得到的散列碼c 組合到result 中:
            result = 37 * result + c;

          3、返回result 值。

          注:根據(jù)實(shí)踐經(jīng)驗(yàn),在對ASCII 串的散列函數(shù)中,31 和37 是很好的散列因子。

          posted on 2006-09-13 18:33 JRobot 閱讀(287) 評論(0)  編輯  收藏 所屬分類: java_基礎(chǔ)

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 曲阳县| 商水县| 澄江县| 米林县| 商洛市| 黔西县| 诸暨市| 东乌| 巴里| 济源市| 任丘市| 广丰县| 蓝山县| 苍山县| 岚皋县| 临西县| 五莲县| 泰宁县| 莱西市| 汝州市| 永城市| 缙云县| 阜城县| 开江县| 武宣县| 辉县市| 大庆市| 苍梧县| 富阳市| 巴楚县| 黑水县| 富锦市| 永州市| 朝阳市| 德庆县| 铜川市| 寻甸| 安远县| 三亚市| 独山县| 清徐县|