java中的hashCode实现

时间:2012-05-23 04:46:27

标签: java hashcode

我有class Dog extends Animal

然后我按如下方式调用hashCode()方法。

Animal animal  = new Dog(200);
System.out.println(animal.hashCode());

下面,
如果我重写了Dog类中的hashCode(),它将被返回。 否则,如果我重写了Dog类中的hashCode(),它将被返回。 否则返回一些整数。

我想知道......

  • 为什么它会调用超类的hashCode() 在Dog类中重写?如何以及“某些整数”生成的内容

  • 当在任何地方都没有生成hashCode时。 (我听说过 是对象的内存位置但不确定。)

4 个答案:

答案 0 :(得分:4)

这称为方法覆盖。 hashCode方法在java.lang.Object中定义,基本上是对象层次结构的顶部,因此它始终可用于Java中定义的任何Object。如果在您的特定子类或其父类之一中未覆盖该方法,则将调用java.lang.Object中定义的默认行为。

您通常不应该担心哈希代码的内部实现在父对象中的内容,但默认实现确实使用了Object的内部地址。请注意,此内部地址正是 - JVM在内部使用 的解释地址,应用程序不应依赖该地址作为特别有意义的内容。

您可以在Java Language Specification - Section 8.4.8中了解有关覆盖效果的更多信息。

答案 1 :(得分:0)

在java中,每个类,如果没有经过深思熟虑,都会将Object类作为其父类。由于Object类定义了hashcode方法,即使您没有在类中定义,也可以使用它。是的,在java中,默认的哈希码实现是返回对象的内存位置。在某种程度上,这看起来是正确的,就好像两个对象在同一个内存位置,而不是它们必须相同。

答案 2 :(得分:0)

hasCode()是父类对象的形式,所以如果你没有覆盖它,那么将调用父方法。我认为你所谓的某个整数是在超级父对象上生成的hashCode。这表明你没有覆盖Animal类中的hashCode。

通常,如果不覆盖超类方法,则将调用直接父方法。

答案 3 :(得分:0)

  1. 首先在java中,每个类,如果没有被提及,将把Object类作为其父类
  2. Java不生成hashCode(),即通常通过将对象的内部地址转换为整数来实现,但Java TM 编程语言不需要此实现技术。 大多数类(特别是如果你打算在任何Collection API中使用它)特别是在hashcontainer(HashSet和HashMap)中应该实现它们自己的HashCode(并通过契约自己的equals方法)。
  3. 如果您有兴趣知道何时实施hashCode()和equals(),您可以访问此网站http://www.javabeat.net/2007/08/hashcode-and-equals-methods/