[英]How default .equals and .hashCode will work for my classes?
說我有自己的課
public class MyObj { /* ... */ }
它有一些屬性和方法。 它不實現equals,不實現hashCode。
一旦我們調用equals和hashCode,默認實現是什么? 來自Object類? 他們是什么? 默認等於如何工作? 默認的hashCode如何工作以及返回什么? ==只會檢查它們是否引用同一個對象,所以這很容易,但是equals()和hashCode()方法呢?
來自其中一個JVM實現中的Object
:
public boolean equals(Object object) {
return this == object;
}
public int hashCode() {
return VMMemoryManager.getIdentityHashCode(this);
}
在這兩種情況下,它只是比較相關對象的內存地址。
是的,來自Object
類,因為您的類隱式地擴展了Object。 equals
只返回this == obj
。 hashCode
實現是原生的。 只是一個猜測 - 它返回指向對象的指針。
如果您不提供自己的實現,則將使用從Object派生的實現。 沒關系,除非你打算將你的類實例放入ie HashSet(任何實際使用hashCode()的集合),或者需要檢查對象相等性的東西(即HashSet的contains()方法)。 否則它將無法正常工作,如果這是你要求的。
由於Apache Commons Lang的 HashCodeBuilder和EqualsBuilder ,很容易提供這些方法的實現。
IBM的開發人員說:
在此默認實現下,只有兩個引用引用完全相同的對象時,它們才相等。 類似地,Object提供的hashCode()的默認實現是通過將對象的內存地址映射到整數值來派生的。
但是,為了確保特定供應商的Java版本的確切實現細節,最好將其視為源(如果可用)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.