hashCode 方法實現規則

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

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

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

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

          3、返回result 值。

          注:根據實踐經驗,在對ASCII 串的散列函數中,31 和37 是很好的散列因子。

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

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


          網站導航:
           
          主站蜘蛛池模板: 岑溪市| 日土县| 南开区| 卫辉市| 洪江市| 侯马市| 东乌珠穆沁旗| 巩义市| 尖扎县| 柳河县| 惠安县| 广宁县| 凤冈县| 灵武市| 星座| 东港市| 高平市| 台南县| 彩票| 保山市| 天水市| 彰化县| 阳江市| 福清市| 古交市| 民丰县| 越西县| 永吉县| 景洪市| 海门市| 县级市| 巢湖市| 仪陇县| 白沙| 瑞金市| 济宁市| 罗江县| 凤冈县| 保山市| 双桥区| 镇远县|