equals(一)

63 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

首先我们知道Java中Object类是所有类的父类,它里面定义了equals()方法: 可以看到是使用= =来进行比较的,那么= =是什么意思呢?其实是比较两个对象的的内存地址。(这里顺便提一下,可以去了解一下Java的堆栈。)
=》若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。

Java中重写的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;
}

我们可以非常清晰的看到String的equals()方法是进行内容比较,而不是单纯的引用比较。

在Java中比较的推荐方法 所以我们一般比较基本数据类型的时候,使用"==",例如 int i = 0; if (i == 1){…},比较两个Integer包装类类型的时候就可以使用equals(),因为Java已经重写了equals()方法了。另外给出几点建议,在java中进行比较,我们需要根据比较的类型来选择合适的比较方式:

对象域,使用equals方法 。 类型安全的枚举,使用equals或== 。 可能为null的对象域 : 使用==null 和 equals 。 数组域 : 使用 Arrays.equals 。 除float和double外的原始数据类型(int,byte等) : 使用 == 。 float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。 double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。 其中6,7参考java中的对应的包装类实现:

为什么要在我们自己的类中重写equals() 但是有时候我们不满足于使用基本数据类型和Java实现的一些继承自Object的哪些类,比如我们实现一个Person类,它是继承自Object类的,所以它的equals()方法默认使用的是文章开头提到的哪个equals()方法,当我们使用equals()进行比较的时候,比较内存地址,那么有可能出现两个Person对象的参数都相同(比如年龄,身份证号等,在我们的实际认知中认为这两个人就是一个人,应该返回true),但是由于他们的内存地址是不一样的,所以equals()方法会返回false。 那么我们就需要去重写equals()方法。