Java重写equals方法

时间:2023-01-19 16:05:56

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