1、Java中eqauls方法和hashCode方法
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同
(2)如果两个对象的hashCode相同,它们并不一定相同(不一定是同一对象)
如果违背了上述原则就会发现在使用容器时,相同的对象可以出现在同一个Set集合(Set不能存储相同的元素)中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)
2、equals方法的特性
(1)自反性
x.equals(x):true
(2)对称性
x.equals(y)返回true时,y.equals(x)也必须返回true
(3)传递性
x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true
(4)一致性
当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值,而且对于任何非null值的引用x,x.equals(null)必须返回false
3、实现高质量的equals方法的诀窍
(1)使用==操作符检查“参数是否为这个对象的引用”
(2) 使用instanceof操作符检查“参数是否为正确的类型”
(3)对于类中的关键属性,检查参数传入对象的属性是否与之相匹配
(4) 编写完equals方法后,问自己它是否满足对称性、传递性、一致性
(5)重写equals时总是要重写hashCode
(6)不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解
public boolean equals(Object obj) { // 判断当前对象和传递的对象 if (this == obj) { return true; } // 判断传递进来的对象是否是Person类型 if (!(obj instanceof Person)) { return false; } // 将obj向下转型为Perosn引用,可以访问Person特有内容,否则只能访问共有内容 Person p = (Person) obj; return this.age == p.age && this.name == p.name; }