持之以恒

          記錄本
          posts - 4, comments - 32, trackbacks - 0, articles - 74
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          隨筆分類

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

          首先我們先來(lái)看下String類的源碼:可以發(fā)現(xiàn)String是重寫(xiě)了Object類的equals方法的,并且也重寫(xiě)了hashcode方法

          復(fù)制代碼
          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;
              }
          復(fù)制代碼

          那為什么在重寫(xiě)equals方法時(shí)都要重寫(xiě)equals方法呢:
          首先equals與hashcode間的關(guān)系是這樣的:

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

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

          自我的理解:由于為了提高程序的效率才實(shí)現(xiàn)了hashcode方法,先進(jìn)行hashcode的比較,如果不同,那沒(méi)就不必在進(jìn)行equals的比較了,這樣就大大減少了equals比較的

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

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

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

          就應(yīng)遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是將對(duì)象數(shù)據(jù)根據(jù)該對(duì)象的特征使用特定的算法將其定義到一個(gè)地址上,那么在后面定義進(jìn)來(lái)的數(shù)據(jù)

          只要看對(duì)應(yīng)的hashcode地址上是否有值,那么就用equals比較,如果沒(méi)有則直接插入,只要就大大減少了equals的使用次數(shù),執(zhí)行效率就大大提高了。

          繼續(xù)上面的話題,為什么必須要重寫(xiě)hashcode方法,其實(shí)簡(jiǎn)單的說(shuō)就是為了保證同一個(gè)對(duì)象,保證在equals相同的情況下hashcode值必定相同,如果重寫(xiě)了equals而未重寫(xiě)

          hashcode方法,可能就會(huì)出現(xiàn)兩個(gè)沒(méi)有關(guān)系的對(duì)象equals相同的(因?yàn)閑qual都是根據(jù)對(duì)象的特征進(jìn)行重寫(xiě)的),但hashcode確實(shí)不相同的

           



          小白
          主站蜘蛛池模板: 资中县| 翁源县| 金阳县| 重庆市| 湖口县| 商南县| 济宁市| 任丘市| 江西省| 梓潼县| 望谟县| 蓬溪县| 游戏| 尼勒克县| 日土县| 托克逊县| 历史| 武功县| 田林县| 治县。| 樟树市| 东城区| 大关县| 繁昌县| 夏河县| 金华市| 延长县| 抚远县| 临泽县| 泗阳县| 成都市| 金昌市| 收藏| 呼和浩特市| 万荣县| 余姚市| 云和县| 华安县| 潜山县| 黎城县| 交城县|