「Emp」類繼承根「OBJECT」類的equals()方法。
下面是equals()方法存在於對象類方法的代碼:
public boolean equals(Object obj)
{
return (this == obj);
}
正如你可以看到,高於該檢查存儲器位置的地址是否相等。
第一種情況:
Emp e1 = new Emp("hello");
Emp e2 = new Emp("hello");
System.out.println(e1 == e2);
這裏你比較基準(內存位置),因爲你已經創建了堆了兩個新的對象,有memroy位置是不同的,因此,它重新調整「假」
第二種情況:
Emp e1 = new Emp("hello");
Emp e2 = new Emp("hello");
System.out.println(e1.equals(e2));
在這裏,您是從「對象」類inturn檢查引用involing繼承的equals()方法(內存locati )這兩個對象,因此重新回到錯誤。
第三種情況:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);
在這種情況下String類具有equals()方法重寫實際上檢查用於比較的對象字段,下面是用於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;
}
這類似於第一種情況,在這裏你比較兩個字符串對象的引用(內存位置),因爲你已經在堆上創建兩個新的對象,有memroy位置是不同的,因此,它重新調整「假「
第四種情況:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));
這裏要調用的重載equals()方法從字符串類方法(上面的代碼粘貼)。如果你看到第一個邏輯實際上檢查兩個refrences是否指向相同的內存位置(如果相同),則返回true,否則它將實際檢查由charcter數組支持的兩個字符串對象的內容,它會比較每一個字符與這些拖曳字符串對象的核心應答,因爲兩個對象具有相同的內容「你好」,它返回true。
肯上述請到通過的equals()和hashCode()的合同。
@vrs,什麼是可比的接口與equals方法在此quesiton的關係? –
可能的重複[爲什麼我們必須重寫java中的equals()方法](http://stackoverflow.com/questions/15175109/why-do-we-have-to-override-equals-method-in-java ) –
查看下面的答案。 –