正常区别
==
- 基本类型:值是否相同
- 引用类型:地址是否相同,在内存中的存放地址(确切的说,是堆内存地址)
注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间
equals
- 引用类型:默认比较地址
如果不重写的话equals就是Object的默认方法
public boolean equals(Object obj) {
return this == obj;
}
Object.equals的默认初始行为,就是比较对象的内存地址,意义不大。
因此一些类库中该方法被重写,如String、Integer、Date,一般对比对象的成员变量值是否相同。
如 Date.equals,就是比较getTime。
public boolean equals(Object obj) {
return obj instanceof Date && this.getTime() == ((Date)obj).getTime();
}
注:可以根据情况重写该方法
String的equals方法
==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
equals():比较的是两个字符串的内容,属于内容比较。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
} else {
if (anObject instanceof String) {
String aString = (String)anObject;
if (this.coder() == aString.coder()) {
return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
}
}
return false;
}
}
String复写的equals比较的是两个字符串的内容
参考:
https://blog.youkuaiyun.com/caoxuecheng001/article/details/88804286
https://blog.youkuaiyun.com/weixin_44509889/article/details/93347191