持之以恒

          記錄本
          posts - 4, comments - 32, trackbacks - 0, articles - 74
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          why在重寫equals時還必須重寫hashcode方法

          Posted on 2012-09-19 14:20 小白19870626 閱讀(340) 評論(0)  編輯  收藏 所屬分類: java

           

          首先我們先來看下String類的源碼:可以發現String是重寫了Object類的equals方法的,并且也重寫了hashcode方法

          復制代碼
          public boolean equals(Object anObject) {
              if (this == anObject) {
                  return true;
              }
              if (anObject instanceof String) {
                  String anotherString = (String)anObject;
                  int n = count;
                  if (n == anotherString.count) {
                  char v1[] = value;
                  char v2[] = anotherString.value;
                  int i = offset;
                  int j = anotherString.offset;
                  while (n-- != 0) {
                      if (v1[i++] != v2[j++])
                      return false;
                  }
                  return true;
                  }
              }
              return false;
              }
          
          
          public int hashCode() {
              int h = hash;
              if (h == 0) {
                  int off = offset;
                  char val[] = value;
                  int len = count;
          
                      for (int i = 0; i < len; i++) {
                          h = 31*h + val[off++];
                      }
                      hash = h;
                  }
                  return h;
              }
          復制代碼

          那為什么在重寫equals方法時都要重寫equals方法呢:
          首先equals與hashcode間的關系是這樣的:

          1、如果兩個對象相同(即用equals比較返回true),那么它們的hashCode值一定要相同;

          2、如果兩個對象的hashCode相同,它們并不一定相同(即用equals比較返回false)

          自我的理解:由于為了提高程序的效率才實現了hashcode方法,先進行hashcode的比較,如果不同,那沒就不必在進行equals的比較了,這樣就大大減少了equals比較的

          次數,這對比需要比較的數量很大的效率提高是很明顯的,一個很好的例子就是在集合中的使用;

          我們都知道java中的List集合是有序的,因此是可以重復的,而set集合是無序的,因此是不能重復的,那么怎么能保證不能被放入重復的元素呢,但靠equals方法一樣比較的

          話,如果原來集合中以后又10000個元素了,那么放入10001個元素,難道要將前面的所有元素都進行比較,看看是否有重復,歐碼噶的,這個效率可想而知,因此hashcode

          就應遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是將對象數據根據該對象的特征使用特定的算法將其定義到一個地址上,那么在后面定義進來的數據

          只要看對應的hashcode地址上是否有值,那么就用equals比較,如果沒有則直接插入,只要就大大減少了equals的使用次數,執行效率就大大提高了。

          繼續上面的話題,為什么必須要重寫hashcode方法,其實簡單的說就是為了保證同一個對象,保證在equals相同的情況下hashcode值必定相同,如果重寫了equals而未重寫

          hashcode方法,可能就會出現兩個沒有關系的對象equals相同的(因為equal都是根據對象的特征進行重寫的),但hashcode確實不相同的

           



          小白
          主站蜘蛛池模板: 启东市| 石狮市| 邵武市| 高阳县| 赤水市| 二连浩特市| 呼伦贝尔市| 清镇市| 阿克苏市| 平原县| 光山县| 新丰县| 阜城县| 女性| 兰州市| 雅江县| 宁陵县| 准格尔旗| 尼勒克县| 宁强县| 安丘市| 南和县| 驻马店市| 宣化县| 星子县| 特克斯县| 衢州市| 小金县| 明星| 大田县| 稻城县| 芷江| 汶上县| 黄梅县| 敦煌市| 景泰县| 灵石县| 霍州市| 泊头市| 花莲县| 甘肃省|