首先,要肯定“==”是 Java 中的一个运算符。
如果使用“==”运算符对基本数据类型(如:int、long、float、double 等)进行操作,则比较的是变量中存储的实际值。例如:
int a = 10;
int b = 20;
if(a == b) {
//...
}上面代码中,“==”运算符则是对 10 和 20 进行比较。
如果使用“==”运算符对引用数据类型(如:String、Object 等)进行操作,则比较的是引用类型变量指向对象的地址值。例如:
// java.lang.Object@b684286
Object a = new Object();
// java.lang.Object@880ec60
Object b = new Object();
if(a == b) {
System.out.println("a == b");
}上面代码中,“==”运算符则是对 a 和 b 变量的值,即对象在堆中的地址进行比较,而不是对对象的实际值进行比较。
equals 是 Object 类的方法,用来比较两个对象的内容是否相等。下面看看 Object 类中equals() 方法的实现:
public boolean equals(Object obj) {
return (this == obj);
}注意:equals 方法不能用于比较基本数据类型(如:int、long、float、double等)。如果在自定义的对象中没有对 equals() 方法进行重写,则相当于“==”,比较的是引用类型的变
量所指向的对象的地址值。
一般情况下,类会重写 equals 方法用来比较两个对象的内容是否相等。例如 String 类中的 equals() 就被重写了,比较的是对象的值。源代码如下:
public boolean equals(Object anObject) {
// 如果两者指向堆中同一个地址,则返回 true
if (this == anObject) {
return true;
}
// 如果 anObject 不是 String 的实例,则返回 false。否则,继续比较
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}