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中对比的方法将会失效。

你可能感兴趣的:(Java)