国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 15:55:46
字體:
供稿:網(wǎng)友

復(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;
    }

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

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

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

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

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

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

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

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

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广西| 英吉沙县| 盈江县| 长汀县| 凉山| 新巴尔虎左旗| 日照市| 哈密市| 三原县| 曲阜市| 吉安市| 揭西县| 灵武市| 长子县| 西昌市| 滦南县| 黎川县| 南开区| 界首市| 大庆市| 阿克陶县| 嘉禾县| 乌兰浩特市| 富宁县| 贵南县| 河北区| 东明县| 德令哈市| 吴旗县| 桑植县| 蒙山县| 五峰| 龙江县| 许昌市| 新巴尔虎左旗| 册亨县| 平乐县| 公安县| 休宁县| 扎赉特旗| 宁夏|