一個例子
public class Test {
private int value;
public Test(int value){
this.value = value;
}
public static void main(String[] args)
{
String s1 = new String("HELLO");
String s2 = new String("HELLO");
System.out.println("s1 == s2 " + (s1 == s2));
System.out.println("s1.equals(s2) " + s1.equals(s2));
Test test1 = new Test(1);
Test test2 = new Test(1);
System.out.println("test1 == test2 " + (test1 == test2));
System.out.println("test1.equals(test2) " + test1.equals(test2));
}
@Override
public boolean equals(Object test){
if (test == this){
return true;
}
if (!(test instanceof Test)){
return false;
}
Test t = (Test) test;
if (this.value == t.value){
return true;
}
return false;
}
@Override
public int hashCode() {
return 1;
}
}
執(zhí)行結(jié)果:
s1 == s2 false
s1.equals(s2) true
test1 == test2 false
test1.equals(test2) true
由上面的例子,我們來談區(qū)別
- 很顯然卿堂,==是操作符嚣潜,equals()是一個方法
- 操作符==進行的是引用的比較,也就是兩個對象的地址比較世囊。方法equals()是內(nèi)容的比較别瞭。換言之,操作符==檢查兩個對象是否指向相同的內(nèi)存地址茸习,而方法equals() 比較兩個對象的值是否相同畜隶。
由上面的例子,補充一些知識點
- 如果類定義中沒有重寫方法equals() 号胚,則默認使用這個類最近的父類的equals() 方法。
- 當重寫方法equals() 時浸遗,也要同時重寫hashCode()方法猫胁。保證兩個相等(equals() 方法結(jié)果為true)的對象,他們的哈希值也要相等(hashCode()返回相同的值)跛锌。為什么相等對象的哈希值要相同弃秆?這里我們舉一個反例論證更加直觀届惋,假如兩個相等對象的哈希值不同,在作為key放入HashMap結(jié)構(gòu)中時菠赚,這兩個相等的對象就會放入到不同的桶中脑豹,在某種意義上HashMap結(jié)構(gòu)中存在key相等的兩個對象。