若 == 两侧都是基本数据类型,则判断的是左右两边操作数据的值是否相等
int a = 10;
int b = 10;
float c = 10.0f;
//以下输出结果均为 true
System.out.println("(a == b) = " + (a == b));
System.out.println("(b == c) = " + (b == c));
若 == 两侧都是引用数据类型,则判断的是左右两边操作数的内存地址是否相同。若此时返回 true , 则该操作符作用的一定是同一个对象。
EntryClass entryClass1 = new EntryClass(1);
EntryClass entryClass2 = new EntryClass(1);
EntryClass entryClass3 = entryClass1;
// (entryClass1 == entryClass2) = false
System.out.println(" (entryClass1 == entryClass2) = " + (entryClass1 == entryClass2));
// (entryClass1 == entryClass3) = true
System.out.println(" (entryClass1 == entryClass3) = " + (entryClass1 == entryClass3));
Object 基类的 equals 默认比较两个对象的内存地址,在构建的对象没有重写 equals 方法的时候,与 == 操作符比较的结果相同。
object类的equals方法,就是比较两个地址是否相同
public boolean equals(Object obj) {
return (this == obj);
}
例如String的equals方法就被重写了,先是判断是否地址相同,不是再判断值是否相同
public boolean equals(Object anObject) {
//首先判断两个对象的内存地址是否相同
if (this == anObject) {
return true;
}
// 判断连个对象是否属于同一类型。
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//长度相同的情况下逐一比较 char 数组中的每个元素是否相同
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 判断规则的前体系,两个对象只要规定的属性相同我们就认为两个对象是相同的。