當比較Java中的物件是否相同時,就要了解物件的Identity與Equality是什麼,兩者有何區別。
Identity是參照上的相同。也就是用==
來比較,如果是物件的話比較的是指向的參照位置。
Equality是內容上的相同。也就是用equals()
及hashCode()
來比較。
例如下面分別用==
及equals()
來比較兩個物件,
因為兩個物件是個別new
出來的,所以參照的記憶體位置不同,因此==
結果為false;
但因為內容相同,所以用equals()
比較結果為true。
public class Main {
public static void main(String[] args) {
People p1 = new People();
p1.setName("Goku");
p1.setPower(3000000);
People p2 = new People();
p2.setName("Goku");
p2.setPower(3000000);
System.out.println(p1 == p2); // false
System.out.println(p1.equals(p2)); // true
}
}
class People {
private String name;
private int power;
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof People)) {
return false;
}
People p = (People) o;
return p.name.equals(name) && p.power == power;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + power;
return result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
}
參考:
沒有留言:
張貼留言