开启掘金成长之旅!这是我参与「掘金日新计划 · 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()方法。