关系运算符会返回一个boolean类型的值,它们计算的是操作数的值之间的关系。——《Java编程思想》
简言之,==就是用来比较值是否相等。而这个比较的规则又分为基本数据类型和非基本数据类型。
Java设计了8个基本数据类型:
浮点型:float(4byte)、double(8byte)
整型:byte(1byte)、short(2byte)、int(4byte)、long(8byte)
字符型:char(2byte)
布尔型:boolean(true/false)
针对基本数据类型,==直接比较数值是否相等;而针对非基本数据类型,==比较的是所引用对象在内存中的地址值,而非对象本身的内容值。(因为引用变量中存放的是其所引用的实际对象在内存中的地址值)
Java内存模型(参考)
equals方法是基类Object中的方法,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
很显然,在Object中equals方法比较的是引用对象的地址值是否相等,即两个引用变量是否指向同一个对象。
然而在实际情况中我们需要通过对象的具体内容来判断对象是否相等,因此我们需要重写equals方法,以下是String类重写的equals方法源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
总结:
重写equals方法的原则:
1、自反性:对于任何非空引用x,x.equals(x)应该返回true;
2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true;
3、传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true;
4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回相同的结果;
5、非空性:对于任意非空引用x,x.equals(null)应该返回false。
重写equals方法的步骤及要点:
1、判断实参是否为null;
2、使用==检查实参是否为指向已知对象的一个引用;
3、使用instanceof操作符检查实参是否为正确的类型;
4、把实参转换为正确的类型;
5、对于该类中每一个关键“域”,检查实参中的域与当前对象中对应的域值是否匹配。对于既不是float又不是double的基本类型的域,可以直接使用==关系运算符来比较;对于对象引用类型的域可以递归调用所引用对象的equals方法进行比较。对于float类型的域可以先使用Float.floatToIntBits()转换成int类型的值,然后再使用==运算符来比较int类型的值;对于double类型的域可以先使用Double.doubleToLongBits()转换成long类型的值,然后再使用==运算符来比较long类型的值;
6、当完成equals方法的重写之后,一定要检查其是否满足对称性、传递性、一致性。
注:equals方法无法作用于基本数据类型。