Enum.hashCode() 背后的原因是什么?

2023-12-27

Enum 类中的 hashCode() 方法是最终方法,定义为 super.hashCode(),这意味着它返回一个基于实例地址的数字,该数字是来自程序员 POV 的随机数。

定义它例如作为ordinal() ^ getClass().getName().hashCode()在不同的 JVM 上是确定性的。它甚至会工作得更好一点,因为最低有效位将“尽可能多地改变”,例如,对于包含最多 16 个元素的枚举和大小为 16 的 HashMap,肯定不会发生冲突(当然,使用 EnumMap 更好,但有时不可能,例如没有 ConcurrentEnumMap)。根据当前的定义,你没有这样的保证,不是吗?

答案摘要

Using Object.hashCode()与上面的更好的 hashCode 相比,如下所示:

  • PROS
    • 简单
  • CONTRAS
    • speed
    • 更多碰撞(对于任何大小的 HashMap)
    • non-determinism, which propagates to other objects making them unusable for
      • 确定性模拟
      • ETag计算
      • 追捕错误取决于例如在一个HashSet迭代顺序

我个人更喜欢更好的 hashCode,但恕我直言,没有任何理由很重要,也许除了速度之外。

UPDATE

我对速度感到好奇并写了一篇基准 https://dl.dropboxusercontent.com/u/4971686/published/maaartin/so/EnumHashCodeBenchmark.java与令人惊讶的results https://microbenchmarks.appspot.com/runs/6af10de0-e379-4aad-a354-cbc8815a466c。对于每个类单个字段的价格,您可以得到一个确定性哈希码,该码几乎是快四倍。将哈希码存储在每个字段中会更快,尽管可以忽略不计。

标准哈希码速度并不快的原因是,当对象被 GC 移动时,它不可能是对象的地址。

UPDATE 2

有一些奇怪的事情going on https://stackoverflow.com/q/24222991hashCode表现一般。当我理解它们时,仍然有一个悬而未决的问题,为什么System.identityHashCode(从对象头读取)比访问普通对象字段慢得多。


我可以想象,使用 Object 的 hashCode() 并将其最终确定的唯一原因是让我问这个问题。

首先,您不应该依赖这种机制在 JVM 之间共享对象。这根本不是受支持的用例。当您序列化/反序列化时,您应该依赖您自己的比较机制,或者仅将结果与您自己的 JVM 中的对象进行“比较”。

让枚举的原因hashCode实施为Objects哈希码(基于身份)是因为,在一个 JVM 内,将会有只能是每个枚举对象的一个​​实例。这足以确保这种实现是有意义且正确的。

你可以像这样争论“嘿,字符串和原语的包装器(长整型、整数……)都有明确定义的、确定性的规范hashCode!为什么枚举没有它?”,首先,您可以有几个不同的字符串引用来表示同一个字符串,这意味着使用super.hashCode将会是一个错误,因此这些类必须需要它们自己的 hashCode 实现。对于这些核心类,让它们具有明确定义的确定性哈希代码是有意义的。

Why他们选择这样解决吗?

嗯,看看的要求hashCode执行 http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29。主要关心的是确保每个对象都应该返回一个distinct哈希码(除非它等于另一个对象)。基于身份的方法非常有效并保证了这一点,而您的建议却没有。这一要求显然比任何关于放松连载等的“便利奖金”都要强。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Enum.hashCode() 背后的原因是什么? 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐

  • 路径查找算法:A* 与跳跃点搜索

    我知道 A 比 Dijkstra 算法更好 因为它考虑了启发式值 但是从 A 和跳跃点搜索来看 哪种算法是在有障碍物的环境中找到最短路径的最有效算法 有何不同 跳跃点搜索是基于图表上的某些条件的改进的 A 因此 如果满足这些条件 主要是统一
  • 在游乐场导入神无

    有没有办法添加 Kanna https github com tid kijyun Kanna https github com tid kijyun Kanna 到 XCode 中的 Playground 我尝试过手动安装并通过 Coco
  • 使用 C# 保护内存中的敏感数据

    我有一个 C 应用程序 它用敏感数据初始化一些变量 它们不是密码 但我们认为它们很敏感 我要保护的变量值都是字符串类型 我想做的是找到一种机制 我知道没有 100 的机制 让我能够保护内存中的变量值 或者至少让攻击者更难读取它们 因此 我可
  • 如何在 php 中使用通过 header() 传递的变量

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在用着header 传递变量use
  • 如何为 Bootstrap 制作响应式(行流体)Mixin

    我可以用以下代码替换此代码 div class row div class span10 div div class span2 div div 有了这个 使其更加语义化 div class article div class main s
  • Visual Studio 2010 Qt 链接问题

    我花了整个周末试图解决这个问题 现在我已经迈出了最后一步 我的目标 让 Visual Studio 2010 和 Qt 4 7 3 一起工作 我从源代码安装了 Qt 指定使用以下配置进行构建 configure exe debug and
  • 使用 SimpleDateFormat 解析奇怪的日期和时间结果

    使用 SimpleDateFormat 解析 ISO8601 日期和时间时遇到一个奇怪的问题 相关代码是 public class DateHelper private static SimpleDateFormat iso8601form
  • Drone.io 在本地构建,无需推送到存储库

    io团队和爱好者 我在本地测试了 Drone io 我喜欢它 有没有办法在本地使用 Drone io 而不推送到存储库 我想在开发人员环境中使用它 这意味着开发人员可以在推送到存储库之前测试他们的代码 可以这样做吗 你可以运行 drone
  • Delphi v10.2.2 升级到 v10.2.3 后 Android 库“将系统文件恢复为默认值”破坏了编译

    将 Delphi 从 v10 2 2 升级到 v10 2 3 后 TBannerAd 横幅在尝试调用 LoadAd 方法时引发异常 在了解到 Tokyo 10 2 3 已更新 Google Play 服务及其库 后 升级到Delphi v1
  • 使用 Bloch 的构建器模式是否会对内存和性能造成影响?

    与仅使用构造函数创建对象相比 内存和性能使用情况如何 这里的用法是创建一个Set or List它可能包含数百万个以上的条目 我担心使用布洛赫的构建器模式的开销 我以前用过它 但从未在这么大的范围内使用过 参考 第 2 项 在面对许多构造函
  • 时间戳的正则表达式

    显然我对正则表达式很糟糕 这对我来说毫无意义 我想要一个匹配时间的表达式 例如01 23 45在一个字符串内 我试过这个 r 0 9 2 2 0 9 2 但它不起作用 我需要能够获取整个时间戳 我尝试过的其他人只找到了大约 2 位数字 恐怕
  • 在 Java 中声明项目常量的正确方法是什么?

    对于 Java 开发人员来说 这似乎是一个愚蠢的问题 但是 我是 Java 新手 而且我的背景是低级 c 语言 我曾经包含一个头文件 其中包含与我的项目相关的所有常量 通常是 define 我现在正在开发一个大型 Java 项目 我需要将一
  • .NET MVC 3 部署包缺少引用

    在 ASP NET MVC3 项目中 我有这样的结构 Core csproj gt 3rdparty1 dll gt 3rdpartyreference dll gt 3rdparty2 dll Web csproj gt core dll
  • Java发生在线程启动之前

    我在某处读到 启动线程对发生之前的关系有一些特殊的影响 现在我不确定我的代码是否保证发生在关系之前 所以请赐教 我有一个 Dispatcher 线程和一个实现的 Worker 类Runnable界面 Dispatcher 线程创建一个新的
  • 如何在 JavaScript 中记录获取的网络资源?

    有没有办法访问浏览器请求的资源列表 在 Chrome 检查器的网络面板中找到的资源 我希望能够迭代这些获取的资源以显示已访问的域 例如 for var i 0 i lt window navigator resources length i
  • Spring Boot 和 Spring Cloud Security OAUTH 2 SSO 在最新版本中失败

    我正在尝试使用 OAuth 将示例 Spring Boot 和 Spring Cloud Security 从 Spring Boot 1 4 1 Brixton RELEASE 升级到 Spring Boot 1 5 3 Dalston
  • 提交后钩子以 svn 中的用户身份运行

    Apache 在 Windows 机器上作为 SYSTEM 运行 post commit bat 应该使用什么用户和密码 我正在尝试将内容复制到目录以在网络服务器上的开发人员版本上进行测试 但似乎无法正常工作 挂钩脚本将由服务器启动 因此您
  • Android View.onDraw() 总是有一个干净的 Canvas

    我正在尝试画动画 为此 我扩展了 View 并重写了 onDraw 方法 我期望的是 每次调用 onDraw 时 画布都会处于我保留它的状态 我可以选择清除它或只绘制它的一部分 这就是我使用 SurfaceView 时的工作方式 但每次画布
  • PhoneGap/Cordova Android 应用程序无法仅通过 3g/4g 访问互联网

    我遇到了一个问题 只有少数用户报告他们无法通过移动网络互联网使用我的应用程序 需要互联网访问 他们根本无法访问网络来登录应用程序 但该应用程序可以通过 Wi Fi 连接完美运行 该请求显然是跨域的 并且服务器API被编程为接受跨域请求 登录
  • Enum.hashCode() 背后的原因是什么?

    Enum 类中的 hashCode 方法是最终方法 定义为 super hashCode 这意味着它返回一个基于实例地址的数字 该数字是来自程序员 POV 的随机数 定义它例如作为ordinal getClass getName hashC