一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - why在重寫equals時(shí)還必須重寫hashcode方法分享

why在重寫equals時(shí)還必須重寫hashcode方法分享

2019-10-17 10:29java技術(shù)網(wǎng) Java教程

首先我們先來看下String類的源碼:可以發(fā)現(xiàn)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方法時(shí)都要重寫equals方法呢:
首先equals與hashcode間的關(guān)系是這樣的:

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

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

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

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

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

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

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久99国产亚洲高清观着 | 国产亚洲精品美女 | japan孕妇孕交 | 色国产视频 | 久久人妻熟女中文字幕AV蜜芽 | 506rr亚洲欧美 | 欧美日韩国产在线人成 | 国产日韩高清一区二区三区 | 好爽好深好猛好舒服视频上 | 亚洲成人aa | 动漫人物差差插曲漫画 | 免费aⅴ在线 | 青草免费在线 | 99精品国产成人a∨免费看 | 午夜一级免费视频 | 亚洲国产综合精品 | 好男人在线观看hd中字 | 日韩日b视频 | 欧美透逼视频 | 爱情岛论坛亚洲自拍 | 婷婷久久综合九色综合九七 | 青草青草视频2免费观看 | 乳女教师欲乱动漫无修版动画3d | 国产成人高清精品免费观看 | 国产精品香蕉在线观看不卡 | 色成人综合网 | 日本精品一卡二卡≡卡四卡 | 娇妻与老头绿文小说系列 | 国产精品视频色拍拍 | 久久99热狠狠色一区二区 | 天天爽视频 | 歪歪私人影院成人毛片 | 久久九九有精品国产23百花影院 | 天天拍天天色 | 色依依视频视频在线观看 | 精品无人区麻豆乱码无限制 | 亚洲a区视频 | 欧美18-19 | 亚洲精品国产一区二区第一页 | 国产播放啪视频免费视频 | 日本不卡1卡2卡三卡网站二百 |