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

Posted

技术标签:

【中文标题】使用 System.identityHashCode(obj) - 啥时候?为啥?【英文标题】:use of System.identityHashCode(obj) - when? why?使用 System.identityHashCode(obj) - 什么时候?为什么? 【发布时间】:2013-06-11 10:44:15 【问题描述】:

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

1  Object o1 = new Object();

2  

3  int hcObj = o1.hashCode();

4  int hcSys = System.identityHashCode(o1);

【问题讨论】:

嗯,好问题...顺便说一下,这两种方法都返回一个 int,而不是一个 long 【参考方案1】:

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

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

【讨论】:

简而言之,Guava 的Equivalence.identity() 是做什么的?但即便如此,你还是有IdentityHashMap,Set @fge: System.identityHashCode 是所有这些数据结构的实现方式。 @sanbhat:它返回Object.hashcode 将返回的值如果它没有被覆盖 @JonSkeet:为什么需要为具有完全相同状态的对象保留不同的引用?他可以只保留一个计数器并保留一个引用。您能否给出一个有意义的具体用例? @Cratylus:对象不一定具有完全相同的状态。它们具有在equals 下等效的状态 - 这可能不是您想要使用的那种等效。正如我所说,它很少有用,但很方便。【参考方案2】:

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

Grepcode lists these call sites,即包括IdentityHashMap 等。

【讨论】:

以上是关于使用 System.identityHashCode(obj) - 啥时候?为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)