簡體   English   中英

默認的.equals和.hashCode如何適用於我的課程?

[英]How default .equals and .hashCode will work for my classes?

說我有自己的課

public class MyObj { /* ... */ }

它有一些屬性和方法。 它不實現equals,不實現hashCode。

一旦我們調用equals和hashCode,默認實現是什么? 來自Object類? 他們是什么? 默認等於如何工作? 默認的hashCode如何工作以及返回什么? ==只會檢查它們是否引用同一個對象,所以這很容易,但是equals()和hashCode()方法呢?

是的,默認實現是Object(一般來說;如果從一個重新定義了equals和/或hashCode的類繼承,那么你將使用該實現)。

從文檔:

equals

類Object的equals方法實現了對象上最具辨別力的等價關系; 也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象時,此方法才返回true(x == y的值為true)。

hashCode

盡可能合理,Object類定義的hashCode方法確實為不同的對象返回不同的整數。 (這通常通過將對象的內部地址轉換為整數來實現,但JavaTM編程語言不需要此實現技術。)

來自其中一個JVM實現中的Object

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

在這兩種情況下,它只是比較相關對象的內存地址。

在Object中有equals()hashCode()默認實現。 如果您不提供自己的實現,將使用這些實現。 對於equals() ,這意味着==比較:如果對象完全是同一個對象,則它們將是相等的。 對於hashCode()Javadoc有一個很好的解釋。

有關更多信息,請參閱Effective Java, 第3章 (pdf),第8項。

是的,來自Object類,因為您的類隱式地擴展了Object。 equals只返回this == obj hashCode實現是原生的。 只是一個猜測 - 它返回指向對象的指針。

如果您不提供自己的實現,則將使用從Object派生的實現。 沒關系,除非你打算將你的類實例放入ie HashSet(任何實際使用hashCode()的集合),或者需要檢查對象相等性的東西(即HashSet的contains()方法)。 否則它將無法正常工作,如果這是你要求的。

由於Apache Commons Lang的 HashCodeBuilderEqualsBuilder ,很容易提供這些方法的實現。

IBM的開發人員說:

在此默認實現下,只有兩個引用引用完全相同的對象時,它們才相等。 類似地,Object提供的hashCode()的默認實現是通過將對象的內存地址映射到整數值來派生的。

但是,為了確保特定供應商的Java版本的確切實現細節,最好將其視為源(如果可用)

暫無
暫無

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

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