使用System.identityHashCode(obj) - 什么时候?为什么?

时间:2013-06-14 17:43:34

标签: java core hashcode

何时是第4行而不是#3行的合理时间?或者它们是完全冗余的调用?

1  Object o1 = new Object();

2  

3  int hcObj = o1.hashCode();

4  int hcSys = System.identityHashCode(o1);

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

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

Grepcode lists these call sites,包括IdentityHashMap等。