<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    持之以恒

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

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

    Posted on 2012-09-19 14:20 小白19870626 閱讀(334) 評論(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確實不相同的

     



    小白
    主站蜘蛛池模板: 亚洲国产美女精品久久| 亚洲一区无码精品色| 亚洲一区二区三区高清| 中文字幕无线码中文字幕免费| 亚洲AV无码乱码在线观看性色扶 | 久久精品国产亚洲AV无码麻豆| 国内精品免费久久影院| 国产亚洲精品美女久久久| 国产成人免费ā片在线观看老同学| 亚洲午夜精品久久久久久浪潮 | 国精产品一区一区三区免费视频| 美腿丝袜亚洲综合| 免费无码又爽又刺激网站| 亚洲国产精品久久66| 18禁黄网站禁片免费观看不卡| 久久久久亚洲av无码专区导航| 四虎1515hh永久久免费| 亚洲成a人片在线网站| 大陆一级毛片免费视频观看i| 亚洲人成电影网站免费| 免费播放春色aⅴ视频| 国产免费人成视频尤勿视频| 国产亚洲av片在线观看播放| 小日子的在线观看免费| 亚洲av永久无码精品天堂久久 | 78成人精品电影在线播放日韩精品电影一区亚洲| 国产精品福利片免费看| 亚洲精品免费在线观看| 女人让男人免费桶爽30分钟| 一级A毛片免费观看久久精品| 亚洲av之男人的天堂网站| 毛片免费视频播放| 一级毛片视频免费| 亚洲欧洲日本精品| 国产一区二区三区免费在线观看| fc2成年免费共享视频18| 亚洲精品偷拍无码不卡av| 国产极品美女高潮抽搐免费网站| 美女被免费网站91色| 2020国产精品亚洲综合网| 国产成人精品日本亚洲专区61|