大漠駝鈴

          置身浩瀚的沙漠,方向最為重要,希望此blog能向大漠駝鈴一樣,給我方向和指引。
          Java,Php,Shell,Python,服務(wù)器運(yùn)維,大數(shù)據(jù),SEO, 網(wǎng)站開發(fā)、運(yùn)維,云服務(wù)技術(shù)支持,IM服務(wù)供應(yīng)商, FreeSwitch搭建,技術(shù)支持等. 技術(shù)討論QQ群:428622099
          隨筆 - 238, 文章 - 3, 評(píng)論 - 117, 引用 - 0

          導(dǎo)航

          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          公告

          本博客提供技術(shù)討論QQ群:428622099,希望志同道合的朋友加入群,共同進(jìn)步和學(xué)習(xí)。
          如果您覺得本博客還可以,請支持網(wǎng)頁頂部的廣告,謝謝。

          常用鏈接

          留言簿(11)

          隨筆分類(214)

          隨筆檔案(239)

          文章分類(1)

          文章檔案(1)

          相冊

          作品

          • 北京韋爾科技有限公司
          • 北京韋爾科技有限公司是一家從事互聯(lián)網(wǎng)相關(guān)技術(shù)研發(fā)型的公司,對外提供互聯(lián)網(wǎng)相關(guān)技術(shù)培訓(xùn),產(chǎn)品研發(fā)等。
          • 映目圖文直播官網(wǎng)
          • 圖文直播-讓直播更簡單更有效。圖文直播基于文字、圖片、視頻的直播方式,直播可嵌入APP、網(wǎng)站和微信公眾平臺(tái),提供多種方式面向企業(yè)個(gè)人支持在線直播云服務(wù)、遠(yuǎn)程部署服務(wù)、技術(shù)支持服務(wù)!
          • 映目官網(wǎng)
          • 映目是一體化自助式全流程的數(shù)字會(huì)議云平臺(tái),擁有直播、活動(dòng)、簽到、互動(dòng)、會(huì)務(wù)、云攝影子產(chǎn)品,提供線上線下一體化服務(wù),包含會(huì)議網(wǎng)站、簽到、互動(dòng)、直播、數(shù)據(jù)統(tǒng)計(jì)、攝影、攝像、速記、翻譯等全流程的線上線下解決方案,辦活動(dòng)找映目,高效率、高質(zhì)量、低成本,映目讓會(huì)議活動(dòng)舉辦更簡單。
          • 映目照片直播官網(wǎng)
          • 映目照片直播,專業(yè)的照片直播、圖片直播、云攝影商業(yè)紀(jì)實(shí)攝影服務(wù)供應(yīng)商,5秒數(shù)快傳、3分鐘快修即刻呈現(xiàn),全國拍攝發(fā)布會(huì)、慶典、年會(huì)、展覽、活動(dòng)、沙龍、派對、講座、課程、會(huì)議、文化演出、體育賽事等活動(dòng)

          搜索

          •  

          積分與排名

          • 積分 - 672909
          • 排名 - 69

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Java:重寫equals()和hashCode()

          以下內(nèi)容總結(jié)自《Effective Java
          1.何時(shí)需要重寫equals()
          當(dāng)一個(gè)類有自己特有的“邏輯相等”概念(不同于對象身份的概念)。
          2.設(shè)計(jì)equals()
          [1]使用instanceof操作符檢查“實(shí)參是否為正確的類型”。
          [2]對于類中的每一個(gè)“關(guān)鍵域”,檢查實(shí)參中的域與當(dāng)前對象中對應(yīng)的域值。
          [2.1]對于非floatdouble類型的原語類型域,使用==比較;
          [2.2]對于對象引用域,遞歸調(diào)用equals方法;
          [2.3]對于float域,使用Float.floatToIntBits(afloat)轉(zhuǎn)換為int,再使用==比較;
          [2.4]對于double域,使用Double.doubleToLongBits(adouble) 轉(zhuǎn)換為int,再使用==比較;
          [2.5]對于數(shù)組域,調(diào)用Arrays.equals方法。
          3.當(dāng)改寫equals()的時(shí)候,總是要改寫hashCode()
          根據(jù)一個(gè)類的equals方法(改寫后),兩個(gè)截然不同的實(shí)例有可能在邏輯上是相等的,但是,根據(jù)Object.hashCode方法,它們僅僅是兩個(gè)對象。因此,違反了“相等的對象必須具有相等的散列碼”。
          4.設(shè)計(jì)hashCode()
          [1]把某個(gè)非零常數(shù)值,例如17,保存在int變量result中;
          [2]對于對象中每一個(gè)關(guān)鍵域f(指equals方法中考慮的每一個(gè)域):
          [2.1]boolean型,計(jì)算(f ? 0 : 1);
          [2.2]byte,char,short型,計(jì)算(int);
          [2.3]long型,計(jì)算(int) (f ^ (f>>>32));
          [2.4]float型,計(jì)算Float.floatToIntBits(afloat);
          [2.5]double型,計(jì)算Double.doubleToLongBits(adouble)得到一個(gè)long,再執(zhí)行[2.3];
          [2.6]對象引用,遞歸調(diào)用它的hashCode方法;
          [2.7]數(shù)組域,對其中每個(gè)元素調(diào)用它的hashCode方法。
          [3]將上面計(jì)算得到的散列碼保存到int變量c,然后執(zhí)行 result=37*result+c;
          [4]返回result。
          5.示例
          下面的這個(gè)類遵循上面的設(shè)計(jì)原則,重寫了類的equals()hashCode()
           package com.zj.unit;
          import java.util.Arrays;
           
          public class Unit {
              
          private short ashort;
              
          private char achar;
              
          private byte abyte;
              
          private boolean abool;
              
          private long along;
              
          private float afloat;
              
          private double adouble;
              
          private Unit aObject;
              
          private int[] ints;
              
          private Unit[] units;
           
              
          public boolean equals(Object o) {
                 
          if (!(o instanceof Unit))
                     
          return false;
                 Unit unit 
          = (Unit) o;
                 
          return unit.ashort == ashort
                        
          && unit.achar == achar
                        
          && unit.abyte == abyte
                        
          && unit.abool == abool
                        
          && unit.along == along
                        
          && Float.floatToIntBits(unit.afloat) == Float
                               .floatToIntBits(afloat)
                        
          && Double.doubleToLongBits(unit.adouble) == Double
                               .doubleToLongBits(adouble)
                        
          && unit.aObject.equals(aObject)
          && equalsInts(unit.ints)
                        
          && equalsUnits(unit.units);
              }
           
              
          private boolean equalsInts(int[] aints) {
                 
          return Arrays.equals(ints, aints);
              }
           
              
          private boolean equalsUnits(Unit[] aUnits) {
                 
          return Arrays.equals(units, aUnits);
              }
           
              
          public int hashCode() {
                 
          int result = 17;
                 result 
          = 37 * result + (int) ashort;
                 result 
          = 37 * result + (int) achar;
                 result 
          = 37 * result + (int) abyte;
                 result 
          = 37 * result + (abool ? 0 : 1);
                 result 
          = 37 * result + (int) (along ^ (along >>> 32));
                 result 
          = 37 * result + Float.floatToIntBits(afloat);
                 
          long tolong = Double.doubleToLongBits(adouble);
                 result 
          = 37 * result + (int) (tolong ^ (tolong >>> 32));
                 result 
          = 37 * result + aObject.hashCode();
                 result 
          = 37 * result + intsHashCode(ints);
                 result 
          = 37 * result + unitsHashCode(units);
                 
          return result;
              }
           
              
          private int intsHashCode(int[] aints) {
                 
          int result = 17;
                 
          for (int i = 0; i < aints.length; i++)
                     result 
          = 37 * result + aints[i];
                 
          return result;
              }
           
              
          private int unitsHashCode(Unit[] aUnits) {
                 
          int result = 17;
                 
          for (int i = 0; i < aUnits.length; i++)
                     result 
          = 37 * result + aUnits[i].hashCode();
                 
          return result;
              }
          }

          posted on 2009-10-31 22:27 草原上的駱駝 閱讀(815) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA基礎(chǔ)知識(shí)

          主站蜘蛛池模板: 正宁县| 金溪县| 康马县| 沂水县| 宣城市| 苗栗市| 宜昌市| 汉寿县| 台湾省| 灯塔市| 湘潭县| 康定县| 博湖县| 乌鲁木齐县| 思南县| 长子县| 峡江县| 平阴县| 菏泽市| 新田县| 亳州市| 舒城县| 赣州市| 海盐县| 青河县| 贵德县| 乳山市| 兴隆县| 平远县| 青冈县| 青河县| 蒙城县| 福贡县| 新河县| 新乡市| 米易县| 于田县| 佳木斯市| 濮阳县| 临澧县| 兴山县|