前言
Java中涉及到“判断相等”的操作必然离不开==与equals(),最初学习Java时背某“面试宝典”的时候就有过相关的问题的记录:
A:“说说Java中==与equals()”的区别。
Q:“==比较内存地址值,equals()比较对象的内容。”
首先说上面的答案看起来清晰明了,但回答的不完整,只针对了某些情况。下面将简要分析一下==与equals()。
关于==
== 是Java中的一个内置的布尔逻辑运算符,表示等于。
在使用==做判断的时候,根据参与比较的成员类型不同,其比较原则也不同。
基本类型使用 ==
当==两端是基本类型时,比较的是两者的字面值。
如:
int num1 = 3;
int num2 = 3;
int num3 = 5;
char char1 = 'a';
char char2 = 'a';
System.out.println(num1 == num2); // true
System.out.println(num1 == num3); //false
System.out.println(char1 == char2); //true
引用类型使用 ==
当==两端是引用类型时,比较的是两者的内存地址值是否相同。
User user1 = new User(); // new 一个新对象
User user2 = new User(); // new 一个新对象
User user3 = user2; // 将user2存储的引用值赋值给变量user3,两者包含相同的引用值。
System.out.println(user1 == user2); // false
System.out.println(user2 == user3); // true
关于equals()
equals()方法是Object类的方法,并提供了实现,返回双方使用==比较的结果。
public boolean equals(Object obj) {
return (this == obj);
}
一般情况下需要重写equals()方法实现比较逻辑。比如String类和基本类型的包装类都自己实现了equals()方法。
- String类的equals实现
public boolean equals(Object anObject) {
if (this == anObject) { // 如果是相同对象,则直接返回true。
return true;
}
if (anObject instanceof String) { //如果是String类型,则转为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;
}
- Integer类equals()实现
public boolean equals(Object obj) {
if (obj instanceof Integer) {
//通过intValue()取到数值,并使用==比较两者数值
return value == ((Integer)obj).intValue();
}
return false;
}
所以equals()方法可以根据自己的需求,规定对象中哪些值相同即可认为相同的逻辑。
补充
比较对象是否相同还有一个重要的方法就是hashCode();通常我们需要一起重写hashCode()和equals()方法,虽然这不是必须的,但这样做可以更严谨地判断对象是否相同。
不同的对象hashCode不同,但hashCode相同也不一定是同一个对象,这时需要借助equals()方法继续判断。
例如Set在判断元素是否重复的时候,会先比较元素的hashCode是否相同,若hashCode不同,则元素没有重复,可直接加入到集合中;若hashCode相同,则会进一步调用equals方法判断对象是否相同。
相关好文:
java中==与equel的区别
为什么重写equals时必须重写hashCode方法?
Java中float和double数据类型的正确比较方式
lombok @EqualsAndHashCode 注解的影响
网友评论