10

什么时候是做第 4 行而不是第 3 行的合理时间?或者它们是完全多余的调用?

1  Object o1 = new Object();

2  

3  int hcObj = o1.hashCode();

4  int hcSys = System.identityHashCode(o1);
4

2 回答 2

11

有时您可能想要创建一组可区分的对象。其中一些对象可能彼此相等,但您仍然希望引用所有这些对象......只丢弃真正重复的引用。您可能会这样做,因为equals实现不是您感兴趣的实现(某些类equals在您真的不希望它们时会覆盖),或者因为您实际上只是试图计算单独的实例等。

为了有效地做到这一点(即由某种哈希表支持),您需要一个基于身份而不是相等的哈希码 - 这正是identityHashCode给您的。它很少有用,但有时仍然很方便。

于 2013-06-14T17:47:37.710 回答
3

对于一个普通的Object,是的,它是多余的。但是在某些情况下,类可能希望在hashCode可能已覆盖的类型的实例上使用默认实现(基于引用相等)hashCode

Grepcode列出了这些呼叫站点,即包括IdentityHashMap其他站点。

于 2013-06-14T17:49:29.480 回答