![](/img/trans.png)
[英]Why is there a need to override hashcode if I override the 'equals' method in Java?
[英]why the return statement of override equals() method has to use alternate && and ||?
我在網上看到下面的代碼。 該類重寫Object類的hashCode()和equals方法。 我只是想知道為什么equals()方法的return語句必須使用替代&&和||? 我可以一直使用&&嗎? 有什么特殊原因為什么必須使用替代&&和||?
class Person {
private int id;
private String firstName;
private String lastName;
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Person guest = (Person) obj;
return id == guest.id
&& ((firstName == null ? guest.firstName == null : firstName.equals(guest.firstName))
|| (firstName != null && firstName.equals(guest.getFirstName())))
&& ((lastName == null ? guest.lastName == null : lastName.equals(guest.lastName))
|| (lastName != null && lastName.equals(guest.getLastName())));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + id;
result = prime * result
+ ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
}
這兩個析取符都可以替換為||
的第一個操作數。 ,因為第二個運算符僅再次覆蓋了tenary運算符的第二個替代項(假設getter返回字段值)
id == guest.id
&& (firstName == null ? guest.firstName == null : firstName.equals(guest.firstName))
&& (lastName == null ? guest.lastName == null : lastName.equals(guest.lastName));
但我建議將其重寫為
id == guest.id
&& Objects.equals(firstName, guest.firstName)
&& Objects.equals(lastName, guest.lastName);
如果不是null
值,則根據分別考慮的名字或姓氏的值使用或條件。 但是那個條件已經在三元組的第二部分中檢查了嗎? :運算符,因此您可以刪除“或”部分。 結果將是相同的
((firstName == null ? guest.firstName == null : firstName.equals(guest.firstName)) || (firstName != null && firstName.equals(guest.getFirstName())))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.