class V {}
public class T1 {
public static void main(String[] args) {
V v = new V();
V v1 = new V();
System.out.println(v.equals(v1)); // 輸出 false
}
}
Object 類別預設的 equals() 實作為 記憶體位址比較:
public boolean equals(Object obj) {
return (this == obj);
}
v 與 v1 是兩個獨立實例,儲存位置不同,故回傳 false。
class V {
private int id;
private String name;
// getter/setter 省略
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
V v = (V) o;
return id == v.id && Objects.equals(name, v.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
equals 時 必須 覆寫 hashCodeObjects.equals 避免空指標new V(1,"A").equals(new V(1,"A")) == true| 運算子 | 比較對象 | 適用場景 |
|---|---|---|
== | 參考位址 / 基本型別值 | 基本型別、Enum、同一物件實例檢查 |
equals() | 邏輯內容(需覆寫) | DTO、Entity、Value Object、集合元素去重 |