Calvin's Tech Space

          成于堅忍,毀于浮躁

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          以下總結自effective java.
          實現equals方法的過程如下:
          1 使用==運算符來判斷是否引用同一個對象。
          2 使用instance of操作符來判斷參數是否是正確的類型。
          3 將實參cast成正確的類型。
          4 對于每個關鍵屬性,進行比較:
          對于非float或double的primitive類型,使用==判斷等價性;
          對于floa類型,先使用Float.floatToIntBits轉換成int類型,然后使用==比較int類型的值;
          對于double類型,先使用Double.doubleToLongBits轉換成long類型,然后使用==比較long類型;
          對于對象引用,遞歸的調用equals方法。
          對于數組類型,對其中的元素進行上述的操作,或者使用Arrays.equals方法(version 1.5)。
          為了避免NPE,可以使用
          field == null ? o.field == null : fleld.equals(o.field);

          重寫hashCode方法如下:
          1 把某個非零常數值,例如17,保存在int變量result中;
          2 對于對象中每一個關鍵域f(指equals方法中考慮的每一個域),計算散列碼c:
          2.1 boolean型,計算(f ? 0 : 1);
          2.2 byte,char,short型,計算(int);
          2.3 long型,計算(int) (f ^ (f>>>32));
          2.4 float型,計算Float.floatToIntBits(f);
          2.5 double型,計算Double.doubleToLongBits(f)得到一個long,再執行[2.3];
          2.6 對象引用,遞歸調用它的hashCode方法;
          2.7 數組域,對其中每個元素按照上面的規則計算hash code。
          3 將上面計算得到的散列碼保存到int變量c,然后執行 result=37*result+c;
          4 返回result。

          posted on 2011-11-10 18:25 calvin 閱讀(401) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 阿鲁科尔沁旗| 南部县| 宜兰市| 宣恩县| 丰台区| 长寿区| 黔西县| 上杭县| 广水市| 丹寨县| 瑞丽市| 澄城县| 平安县| 陇南市| 满洲里市| 长泰县| 土默特右旗| 伊川县| 东乌珠穆沁旗| 宝清县| 赤城县| 勐海县| 平江县| 沂源县| 迭部县| 微山县| 庄河市| 陕西省| 邓州市| 肥乡县| 高安市| 灵台县| 卓资县| 汶川县| 津南区| 休宁县| 上犹县| 莱州市| 汉寿县| 博罗县| 河东区|