java equals详解

首先equals方法是object类的方法,所有的类都默认继承object类,object类也就是所有类的超类。

如果两个对象进行相等比较,需要调用x.equals(y),但是如果没有重写equals方法,那么默认使用的是object类的equals方法

public boolean equals(Object obj) {
    return (this == obj);
}

而在object中的equals方法是这样定义的,如果引用地址相同,那么就证明两个对象相同,这样远远是不够的。

String 的equals方法:

如下:重写object的equals方法,首先进行内存地址的比较,然后进行数据类型的比较,然后进行字符串长度的比较,最后再进行每一个字符的比较

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

在实际中,例如说比较两个自定义的对象,那么就需要进行equals方法的重写了

equals方法遵循以下特性:

1.自反性:对于任何非空的引用x,x.equals(x) 应该返回true

2.对称性,对于任何非空引用x,y ,都应该遵循x.equsla(y)=true 和y.equals(x)=true

3.传递性:对于任何引用x,y,z 如果x.equsla(y)=true,那么y.equals(x)=true

4.一致性:如果X和y的引用没有发生变化,那么反复调用x.equsla(y)返回的结果应该相同

5.对于任意非空引用x,x.equals(null)都应该等于false


完整的equals思路:例如x.equals(y)

1.首先检查x==y,进行地址检查,如果相等,这是快速的方式

2.检查y是否等于null,如果为null则返回false

3.检查x与y是否是同一个类,此时存在两种检测方式:如果不存在子类父类关系,则可以随意使用

(1).利用instanceof进行检查(父类定义相等关系)

(2).利用getClass进行检查(子类定义相等关系)

4.然后对所需要对比的属性进行比较


如果x.equals(y) ,那么x.hashCode和y.hashCode是一定相同的。

重写equals方法,就需要重新定义hashcode()



你可能感兴趣的:(java基础)