eqauls方法和hashCode方法

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;
    }
原文地址:https://www.cnblogs.com/zhai1997/p/12722440.html