1. 两者最大的区别
==能比较基本数据类型,也能比较引用数据类型;
equals()只能比较引用数据类型。
2. 对于基本数据类型,== 比较的是两者的值是否相同
int a = 8;
int b = 8;
int c = 9;
System.out.println("a == b : " + (a == b)); //true
System.out.println("a == c : " + (a == c)); //false
3. 对于引用数据类型(重点)
== 比较的是存储对象的内存地址
equals()本质上就是 == ,Object中equals()的源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
那么问题来了,下面的情况是怎么回事?
String str1 = "8";
String str2 = "8";
String str3 = new String("8");
// ==
System.out.println("str1 == str2 : " + (str1 == str2));
System.out.println("str1 == str3 : " + (str1 == str3));
// equals()
System.out.println("str1.equals(str2) : " + str1.equals(str2));
System.out.println("str1.equals(str3) : " + str1.equals(str3));
结果如下:
str1 == str2 : true
str1 == str3 : false
str1.equals(str2) : true
str1.equals(str3) : true
其实,这是因为String类重写了equals()方法,源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
以上三点是我的理解,欢迎路过的高人发表看法!