默认的.equals和.hashCode如何适用于我的课程?

时间:2010-11-14 18:40:06

标签: java object equals hashcode equality

说我有自己的班级

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

它有一些属性和方法。它没有实现equals,也没有实现hashCode。

一旦我们调用equals和hashCode,默认实现是什么?来自Object类?他们是什么?默认等于如何工作?默认的hashCode如何工作以及返回什么? ==只会检查它们是否引用同一个对象,所以这很容易,但是equals()和hashCode()方法呢?

6 个答案:

答案 0 :(得分:90)

是的,默认实现是Object(一般来说;如果从一个重新定义了equals和/或hashCode的类继承,那么你将使用该实现)。

来自文档:

equals

  

类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,此方法返回   当且仅当x和y引用同一个对象时才为true(x == y的值为true)。

hashCode

  

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

答案 1 :(得分:45)

来自其中一个JVM实现中的Object

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

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

在这两种情况下,它只是比较相关对象的内存地址。

答案 2 :(得分:10)

Object中有equals()hashCode()的默认实现。如果您不提供自己的实现,将使用这些实现。对于equals(),这意味着==比较:如果对象完全是同一个对象,则它们将是相等的。对于hashCode()Javadoc有一个很好的解释。

有关更多信息,请参阅Effective Java,Chapter 3(pdf),第8项。

答案 3 :(得分:1)

是的,来自Object类,因为您的类隐式扩展了Object。 equals只返回this == objhashCode实现是原生的。只是一个猜测 - 它返回指向对象的指针。

答案 4 :(得分:1)

如果您不提供自己的实现,则将使用从Object派生的实现。没关系,除非你打算将你的类实例放入ie HashSet(任何实际使用hashCode()的集合),或者需要检查对象相等性的东西(即HashSet的contains()方法)。否则它将无法正常工作,如果这是你要求的。

由于来自HashCodeBuilderEqualsBuilderApache Commons Lang,很容易提供这些方法的实现。

答案 5 :(得分:0)

IBM的developerworks说:

  

在此默认实现下,两个   引用只有在它们相同时才相等   指的是完全相同的对象。   同样,默认实现   Object提供的hashCode()是   通过映射内存地址得出   该对象为整数值。

但是,为确保特定供应商的Java版本的确切实现细节,最好将其视为源(如果可用)