Enum.hashCode()背后的原因是什么?
类 Enum 中的方法 hashCode() 是 final,定义为 super.hashCode(),这意味着它根据实例的地址返回一个数字,这是程序员 POV 的随机数。
例如,定义它是跨不同JVM的确定性。它甚至可以更好地工作,因为最低有效位将“尽可能多地改变”,例如,对于包含最多16个元素的枚举和大小为16的HashMap,肯定不会发生冲突(当然,使用EnumMap更好,但有时是不可能的,例如没有ConcurrentEnumUmMap)。根据目前的定义,你没有这样的保证,对吧?ordinal() ^ getClass().getName().hashCode()
答案摘要
使用比较更好的哈希码,如上面的哈希码,如下所示:Object.hashCode()
- 优点
- 单纯
- 禁忌症
- 速度
- 更多冲突(适用于任何大小的哈希映射)
- 非确定性,它传播到其他对象,使它们无法用于
- 确定性模拟
- ETag 计算
- 根据迭代顺序等方式搜索错误
HashSet
我个人更喜欢更好的哈希码,但恕我直言,除了速度之外,没有理由权重太大。
更新
我对速度感到好奇,并写了一个具有令人惊讶结果的基准测试。对于每个类的单个字段的价格,您可以获得确定性哈希代码,其速度几乎快四倍。在每个字段中存储哈希代码会更快,尽管可以忽略不计。
标准哈希代码速度不快的解释是,当对象被GC移动时,它不能是对象的地址。
更新 2
总的来说,表演有一些奇怪的事情。当我理解它们时,仍然存在一个悬而未决的问题,为什么(从对象标头读取)比访问普通对象字段慢得多。hashCode
System.identityHashCode