我有点困惑,因为这个问题在面试中被问到,我说:“”当每个对象在当前运行的应用程序中的堆上创建时,会生成hashCode“”
但是采访中说:“当我们在对象上调用hashcode方法时会生成它”
更多的是,我希望更深入地了解哈希码(以及对于java来说),请分享一些链接/来源,因为它在一些求职面试中被广泛询问
PS:当我在一个对象上执行sysout时,输出来自employee @ 942f533
答案 0 :(得分:4)
这取决于你在这里的意思。正如提到的其他答案,在创建函数时不会调用函数本身。然而,
90 * As much as is reasonably practical, the hashCode method defined by
91 * class {@code Object} does return distinct integers for distinct
92 * objects. (This is typically implemented by converting the internal
93 * address of the object into an integer, but this implementation
94 * technique is not required by the ... [JDK]
来自http://www.docjar.com/html/api/java/lang/Object.java.html
由于对象的地址是在创建时分配的,因此从某种意义上说,这是正确的。但是,由于它不是必需的,并且许多对象定义了覆盖,因此并不一定适用于所有对象。
通常在面试中,你必须向面试官挑战一下来描述你的意思。如果你这样做而且你是对的,问题就解决了,如果你这样做而且你错了,那么你至少表明你对你的原始陈述所表现出的理解更深刻。
答案 1 :(得分:0)
hashcode()就像任何其他方法一样。创建对象时不会调用它,当您将对象放入地图时可能会调用它。
我认为首先要阅读的文档应该是:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
答案 2 :(得分:0)
实际上,您需要了解哈希码的用法才能理解。
在创建对象时但未调用hashCode()时生成的Hashcode。
对于每个对象,您可能不希望覆盖java.lang.Object的哈希代码的默认实现。实际上,所有在内部使用散列算法的类都需要它。例如HashMap,HashSet等。如果你去检查那些方法的内部实现,你会发现哈希码的使用等。
java.util.HashMap的代码片段:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
正如您所见,它用于从数据结构中获取正确的对象。
如果你检查对象哈希码的注释,它也清楚地提到了这个
* Returns a hash code value for the object. This method is
* supported for the benefit of hashtables such as those provided by
* <code>java.util.Hashtable</code>.