您好,登錄后才能下訂單哦!
這篇文章主要講解了“java中equals和hashCode的作用是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java中equals和hashCode的作用是什么”吧!
什么時候覆蓋equals方法我就不再說了,相信熟悉Java的讀者肯定都知道,我們著重聊一下如何書寫規(guī)范的equls方法。因為一個不規(guī)范的equals方法將會造成集合無法表現(xiàn)出預(yù)期的行為。
重寫equals方法需要保證equals滿足以下特性:
該要求說明對象必須等于自身,如果違背這一條你會發(fā)下集合的contains方法無法告訴你正確的結(jié)果。
對稱性要求兩個對象對于它們是否相等要保持一致,下面這段代碼違反了對稱性
public class IgnoreCaseString {
private final String s;
public IgnoreCaseString(String s) {
this.s = s;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof IgnoreCaseString) {
return s.equalsIgnoreCase(((IgnoreCaseString) obj).s);
}
if (obj instanceof String) {
return s.equalsIgnoreCase((String) obj);
}
return false;
}
public static void main(String[] args) {
IgnoreCaseString ignoreCaseString = new IgnoreCaseString("Phone");
String string = "phone";
System.out.println(ignoreCaseString.equals(string));
System.out.println(string.equals(ignoreCaseString));
System.out.println("------------------------------");
List<String> list = new ArrayList<>();
list.add(string);
System.out.println(list.contains(ignoreCaseString));
}
}
這種情況通常發(fā)生在具有父子關(guān)系的對象中,子類增加的信息會影響到equals的比較結(jié)果。解決這種問題通常有兩種方式,一種是通過getClass()的方式(具體的大家可以通過閱讀Effective Java這本書),還有一種是在我們擴(kuò)展類的功能時盡量使用復(fù)合而并不是使用繼承,通過復(fù)合組件里面的域的比較也可以解決。
一致性要求如果兩個對象相等,那么他們就必須保持相等,除非它們中有對象被修改了。
非空性要求所有的對象不等于null
在每個覆蓋了equals方法的類中,必須重寫hashCode方法。如果不這樣做,會導(dǎo)致該類無法與所有基于散列的集合一起正常運(yùn)作。hashCode方法需要遵循以下規(guī)定:
使用非0初始值的原因是讓域初始值為0的那些域可以影響到散列值,如果使用0那么散列值不會再受這些域的影響,從而增加Hash沖突的可能性,從而降低了散列表的性能
31是一個奇素數(shù),在Java中如果兩個比較大的數(shù)相乘則會發(fā)生移除,31并不算一個比較大的數(shù),其次選用31的理由是可以用移位和減法來代替乘法,31 * i = (i << 5) - i,現(xiàn)在的VM都可以自動完成這種優(yōu)化,因此可以獲得很好的性能提升
如果一個類是不可變的并且計算散列碼的成本比較大,可以考慮把散列碼緩存在對象內(nèi)部,而不是每次請求時都重新計算(這一點在Kafka中也有所應(yīng)用)。
感謝各位的閱讀,以上就是“java中equals和hashCode的作用是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java中equals和hashCode的作用是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。