“==”的解释
首先,“==”比较的是数据类型的“表面值”。在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;
}
显而易见的是equals()首先比较的是对象,他在一般情况下是不能比较基本数据类型的。
在比较的最开始equals()方法比较了两个对象参数的地址值是否相等。if (this == anObject)
Object a = new Object();
Object b = new Object();
if(a.equals(b)){
System.out.println("true");
} else {
System.out.println("false");
}
//false
如果相等返回true方法执行完毕,如果不相等,再接着往下判断 if (anObject instanceof String) ,如果传入的参数是String数据类型的实例化对象时执行代码块,否则返回false。代码块里首先比较两个字符串的长度是否相等,如果相等继续比较每个字符,全部相等返回true,否则返回false。