为什么重写equals

为什么重写equals

先说一说 == 比较

对于基本数据类型 == 比较的是数值
对于引用数据类型 == 比较的是地址

我们在初学Java时,String类我们会使用equals来比较两个字符串的值是否相等
有些同学就会误认为equals比较的是引用类型的值。

但实际上,所有对象继承自Object类。默认情况下,equals比较的仍然是地址。

我们来看一看Object中equals方法的源码

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

this代表代用该方法的对象,obj表示要比较的对象。
我们发现,equals方法又回到了两者用等于号比较。
即引用数据类型 == 比较的是地址。
那为什么String类调用equals比较的是值呢?
因为String类重写了equals方法

String类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;
    }

首先还是用==号比较,如果地址相同。两者当然也相同。
然后下一步,将里面的值进行了比较。

对于大部分Java原生对象,大多都重写了equals方法。
如果不确定,可以ctrl+鼠标左键点击进行查看。

所以我们在自定义对象时,如果不重写equals方法。
那么比较的将是两个对象的地址,即使值相同。但两者地址不同,仍然会判断为不相等。

你可能感兴趣的:(为什么重写equals)