equals 用法建議
1.顯式參數命名爲otherObject,稍後需要將它轉換成另一個叫做other的變量。
2.檢測this與otherObject是否引用同一個對象
if (this == otherObject) return true;
這條語句只是一個優化。實際上,這是一種經常採用的形式。因爲計算這個等式要比一個一個地比較類中的域所付出的代價小得多。
3.檢測otherObject是否爲null,如果爲null,返回false。
if (otherObject == null) return false;
4.比較this與otherObject是否屬於同一個類。如果equals的語言在每個子類中有所改變,就使用getClass檢測:
if (getClass() != otherObject.getClass()) return false;
如果所有的子類都擁有統一的語義,就使用instanceof檢測:
if (!(otherObject instanceof ClassName)) return false;
5.將otherObject轉換爲相應的類類型變量:
ClassName other = (ClassName)otherObject
6.現在開始對所有需要比較的域進行比較了。使用==比較基本類型域,使用equals比較對象域。如果所有的域都匹配,就返回true;否則返回false.
return field1 == other.field1 && field2.equals(other.field2)&&...;
如果在子類中重新定義equals,就要在其中包含調用super.equals(other);
若沒有覆蓋Object類的equals方法,可以使用@Override對覆蓋超類方法進行標記:
@Override public boolean equals(Object other)
代碼示例:
package com.test.xqh;
public class EqualsTest {
public static void main(String[] args) {
Person p = new Person("張三", "110");
Person p1 = new Person("李四", "110");
Person p2 = new Person("張三", "110");
System.out.println(p.equals(p2)); // true
System.out.println(p.equals(p1)); // false
}
}
class Person {
private String name;
private String ID;
Person(String name, String ID) {
this.name = name;
this.ID = ID;
}
Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public boolean equals(Object otherObject) {
if (this == otherObject)
return true;
if (otherObject == null)
return false;
if (getClass() != otherObject.getClass())
return false;
if (!(otherObject instanceof Person))
return false;
Person p = (Person) otherObject;
return name.equals(p.name) && ID.equals(p.ID);
//return name == p.name && ID == p.ID;
}
}