在实际编程中,经常会需要比较两个值或两个对象是否相等(相同),这时我们通常会使用==
或equals
。那么它们各自代表着什么含义,又有什么区别呢?今天来总结一下。
关系操作符==
有两种情况:数据是基本类型,或引用类型(即对象)
- 对于基本数据类型(八种),
==
比较的是值 - 对于引用类型,
==
比较的是所引用的对象是否是同一个,即指向的内存地址
是否相同
下面看测试代码:
private static void main(String[] args) {
int a1 = 10;
int a2 = 10;
System.out.println(a1 == a2);
double d1 = 6.7;
double d2 = 6.7;
System.out.println(d1 == d2);
boolean b1 = true;
boolean b2 = true;
System.out.println(b1 == b2);
char c1 = 'x';
char c2 = 'x';
System.out.println(c1 == c2);
}
测试结果:
true
true
true
true
equals
方法
首先我们要理解,这个equals方法是我们要比较的对象所属的类从超类Object一层一层继承过来的。那么我们先看一下Object类中的源码:
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}
哦,原来Object类的这个equals方法用的是==啊。那为什么String对象的equals方法居然能比较两个不同的对象相等呢?我们看下String类的源码:
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
类重写了Object
类的equals
方法,使用equals
比较String
对象变成了比较每一个字符的值,所以值
相同的String对象才会相等
。
因此,在使用equals
比较引用类型时,如果这个对象所属的类重写了equals
方法,就按照这个规则来判定。如果没有重写,那么就按照Object
类的equals
方法判断——也就是与==
号相同了。
注:基本数据类型与引用类型不同,它不属于任何类,也就没有equals
方法了。
下面看测试代码:
package com.eknown.basic;
/**
* @author zfh
* @version 1.0
* @since 2019/5/16 9:28
*/
public class EqualsTest {
public static void main(String[] args) {
// 测试重写了equals方法的String类对象
System.out.println("测试重写了equals方法的String类对象");
String str1 = new String("abc"); // 注意:String str = "abc"和 str = new String("abc")是不同的。
String str2 = new String("abc");
String str3 = new String("gcc");
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
// 测试未重写equals方法的User对象
System.out.println("测试未重写equals方法的User对象");
User user1 = new User(1, "java");
User user2 = new User(2, "python");
System.out.println(user1.equals(user2));
System.out.println(user1 == user2);
user2 = user1;
User user3 = user1;
System.out.println(user2.equals(user3));
}
}
public class User {
private Integer id;
private String name;
User(Integer id, String name) {
this.id = id;
this.name = name;
}
// ... getters and setters
}
运行结果:
测试重写了equals方法的String类对象
true
false
测试未重写equals方法的User对象
false
false
true
参考:
- Matrix海子——浅谈Java中的equals和==