why在重寫equals時還必需重寫hashcode辦法分享。本站提示廣大學習愛好者:(why在重寫equals時還必需重寫hashcode辦法分享)文章只能為提供參考,不一定能成為您想要的結果。以下是why在重寫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確切不雷同的