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