簡體   English   中英

為什么我們必須覆蓋 Java 中的 equals() 方法?

[英]Why do we have to override the equals() method in Java?

我對我們覆蓋.equals方法的原因有些困惑。

例如:

Test test1 = new Test(3);
Test test2 = new Test(3);

//The if comparison does the same thing that the overridden `.equals()` method does.
if(test1.equals(test2)){
    System.out.println("test1 and test2 are true in .equals()");
}

// Override .equals method.
public boolean equals(Object object) {
    if(object instanceof Test && ((Test)object).getValue() == this.t) {
        return true;
    } else {
        return false;
    }
}

我不明白為什么我們必須覆蓋.equals()方法。

從文章Override equals and hashCode in Java

java.lang.Object 提供的equals() 類的默認實現比較內存位置,只有當兩個引用變量指向相同的內存位置時才返回true,即它們本質上是同一個對象。

如果相等性將通過邏輯方式或通過某些業務邏輯定義, Java 建議覆蓋 equals和 hashCode 方法:例如:

Java 標准庫中的許多類確實覆蓋了它,例如 String 覆蓋 equals,如果兩個 String 對象的內容完全相同,則其 equals() 方法的實現返回 true

整數包裝類覆蓋等於執行數值比較等。

這應該足以回答您的問題: http : //docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

equals()方法比較兩個對象是否相等,如果相等則返回true Object類中提供的equals()方法使用恆等運算符 ( == ) 來確定兩個對象是否相等。 對於原始數據類型,這給出了正確的結果。 但是,對於對象,則不然。 Object提供的equals()方法測試對象引用是否相等——即比較的對象是否是完全相同的對象。

要測試兩個對象在等價意義上是否相等(包含相同的信息),您必須覆蓋equals()方法。

(部分引用 - 點擊閱讀示例。)

.equals()不會對大多數類執行智能比較,除非類覆蓋它。 如果它不是為(用戶)類定義的,它的行為與 == 相同。

參考: http : //www.leepoint.net/notes-java/data/expressions/22compareobjects.html http://www.leepoint.net/data/expressions/22compareobjects.html

java.lang.Object 的默認行為是比較引用,但這並不適用於所有類型的對象。 有些東西稱為值對象(如 BigDecimal 或 String),其中具有相同值的對象被認為是可互換的,因此 equals 的默認行為是不可取的。 這些類型的對象必須根據對象所采用的值來實現 equals 和 hashcode。

要回答您的問題,首先我強烈建議您查看文檔

如果不覆蓋 equals() 方法,它將像“==”一樣工作。 當您在對象上使用“==”運算符時,它只是檢查這些指針是否指向同一個對象。 如果他們的成員包含相同的值,則不會。

我們重寫以保持我們的代碼干凈,並將比較邏輯從 If 語句抽象到對象中。 這被認為是很好的做法,並利用了 Java 的大量面向對象的方法。

讓我給你舉一個我覺得很有幫助的例子。

您可以將參考視為一本書的頁碼。 假設現在你有兩個頁面 a 和 b,如下所示。

BookPage a = getSecondPage();

書頁 b = getThirdPage();

在這種情況下, a == b 會給你錯誤。 但為什么? 原因是 == 所做的就像是比較頁碼。 因此,即使這兩個頁面上的內容完全相同,您仍然會得到錯誤。

但是,如果您要比較內容,我們該怎么辦?

答案是編寫您自己的 equals 方法並指定您真正想要比較的內容。

默認情況下 .equals() 使用 == identity 函數進行比較,這顯然不起作用,因為實例 test1 和 test2 不相同。 == 僅適用於原始數據類型,如 int 或 string。 所以你需要通過比較Test類的所有成員變量來覆蓋它以使其工作

Object.equals() 方法只檢查對象的引用,而不是原始數據類型或對象值(原始數據的包裝類對象,簡單原始數據類型(byte、short、int、long 等))。 所以當我們根據原始數據類型比較對象時,我們必須覆蓋 equals() 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM