why在重寫equals時(shí)還必須重寫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í)不相同的
- java中hashCode方法與equals方法的用法總結(jié)
- 詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系
- 重寫hashCode()和equals()方法詳細(xì)介紹
- JAVA hashCode使用方法詳解
- 詳解Java中用于查找對(duì)象哈希碼值的hashCode()函數(shù)
- 為什么在重寫 equals方法的同時(shí)必須重寫 hashcode方法
- java 中HashCode重復(fù)的可能性
- javascript中實(shí)現(xiàn)兼容JAVA的hashCode算法代碼分享
- 重新實(shí)現(xiàn)hashCode()方法
相關(guān)文章
java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)
這篇文章主要給大家介紹了關(guān)于java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)的相關(guān)資料,需要的朋友可以參考下2023-08-08Java?Mybatis的初始化之Mapper.xml映射文件的詳解
這篇文章主要介紹了Java?Mybatis的初始化之Mapper.xml映射文件的詳解,解析完全局配置文件后接下來就是解析Mapper文件了,它是通過XMLMapperBuilder來進(jìn)行解析的2022-08-08Java BigDecimal類的使用和注意事項(xiàng)
這篇文章主要講解Java中BigDecimal類的用法,并簡(jiǎn)單介紹一些注意事項(xiàng),希望能給大家做一個(gè)參考。2016-06-06MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例
這篇文章主要介紹了MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Java matches類,Pattern類及matcher類用法示例
這篇文章主要介紹了Java matches類,Pattern類及matcher類用法,結(jié)合實(shí)例形式分析了java matches類,Pattern類及matcher類針對(duì)字符串常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-03-03Java開源工具iText生成PDF簡(jiǎn)單實(shí)例
這篇文章主要介紹了Java開源工具iText生成PDF簡(jiǎn)單實(shí)例,本文給出了3段代碼實(shí)例,講解創(chuàng)建一個(gè)簡(jiǎn)單PDF文件,在PDF中添加表格以及在PDF中添加圖片,需要的朋友可以參考下2015-07-07springboot集成springsecurity 使用OAUTH2做權(quán)限管理的教程
這篇文章主要介紹了springboot集成springsecurity 使用OAUTH2做權(quán)限管理的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12