== 是运算符
对于基础数据类型,== 用于比较值是否相等
对于引用类型,== 用于比较内存地址是否相等,即是否为同一个对象
equals为Object对象中的方法
用于比较两个对象的内存地址是否相等
// Object对象的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
可以看到,其实Object中的equals本身就是使用 == 来比较内存地址,一般来说,意义不大,所以很多类对equals进行了重写。
例如String类中,equals方法就是用于比较两个字符串的值是否相等
// String对象的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;
}
- 特别说明
在一些包装类型的valueOf()方法,例如Long中
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
当数值超过128时,是采用new的方式返回一个新对象,这将会导致 == 运算的错误,这是一般用equals来进行比较