Java重寫equals方法

重寫equals方法的注意點

1. 自反性:對於任意的引用值x,x.equals(x)一定爲true
2. 對稱性:對於任意的引用值x 和 y,當x.equals(y)返回true,y.equals(x)也一定返回true
3. 傳遞性:對於任意的引用值x、y和z,如果x.equals(y)返回true,並且y.equals(z)也返回true,那麼x.equals(z)也一定返回 true
4. 一致性:對於任意的引用值x 和 y,如果用於equals比較的對象信息沒有被修改,多次調用x.equals(y)要麼一致地返回true,要麼一致地返回false
5. 非空性:對於任意的非空引用值x,x.equals(null)一定返回false

重寫equals方法的正確示例

import org.apache.commons.lang3.builder.HashCodeBuilder;

public class Person {
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @override
    public boolean equals(Object obj) {
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }

        Person person = (Person)obj;

        if (this.name = null) {
            return person.getName() == null;
        } else {
            return this.name.equals(person.getName());
        }
    }

    @override
    public int hashCode() {
        return new HashCodeBuilder().append(name).toHashCode();
    }
}

說明:
1. 在equals中使用getClass進行類型判斷。因爲instanceof在繼承對象中可能會引起對稱性的問題。
2. 重寫equals方法必須重寫hashCode方法。如果不重寫,那麼諸如HashMap中對比的方法將會失效。

發佈了42 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章