当前位置: 首页 > 面试题库 >

JVM如何确保System.identityHashCode()永远不会改变?

常元章
2023-03-14
问题内容

通常,默认实现 Object.hashCode() 是内存中对象分配地址的某些功能(尽管 JLS
并未强制执行此功能)。既然VM会在内存中分流对象,为什么 System.identityHashCode()
在对象的生命周期内返回的值从不改变?

如果这是一次“一次性”计算(对象的hashCode计算一次,并存放在对象标题或其他内容中),那么这是否意味着两个对象可能具有相同的对象identityHashCode(如果它们恰好是第一次分配给对象)内存中的相同地址)?


问题答案:

现代JVM将值保存在对象标头中。我认为,通常仅在首次使用时才计算该值,以使花费在对象分配上的时间最小化(有时低至十几个周期)。可以编译通用的Sun
JVM,以便所有对象的标识哈希码始终为1。

多个对象可以具有相同的身份哈希码。这就是哈希码的本质。



 类似资料:
  • 下面的演示作为一个素材工具栏,其样式如下: https://angular-material-toolbar-fixed-with-styling.stackblitz.io/ https://stackblitz.com/edit/Angular-Material-Toolbar-Fixed-with-styling?file=src%2fapp%2fapp.component.ts 我们应该如

  • 问题内容: 我正在开发游戏,但扫描仪遇到了一个小问题。我收到了一个从未关闭过的资源泄漏扫描程序。 但是我认为我的扫描仪在没有关闭之前就可以正常工作。但是现在不是。有人可以帮我吗? 问题答案: 我假设您正在使用Java 7,因此会收到编译器警告,当您不关闭资源时,通常应在finally块中关闭扫描程序。 甚至更好:使用新的 Try with resource语句 :

  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 问题内容: 我正在使用Flask-WTF: 这是我的表格: 这是控制器: 现在的问题是,如果您查看我的打印语句,它将始终打印已提交的内容,但从不打印有效的内容,并且永远不会执行validate_on_submit()。为什么? 问题答案: 您没有在HTML表单中插入CSRF字段。 添加到模板(docs)后,表单将按预期验证。 验证表单后添加,以查看出现的错误。 在验证之前将为空。在这种情况下,会出

  • 1)我的plist配置提供背景模式: 2) 在中,我有: 3) 我在委托中声明了协议。 4)我实现了以下方法,但它永远不会被触发。(只有当我用“XCode-”模拟获取时才有效 为什么?这是DP5测试错误吗?我应该雷达这个吗?

  • 例如,假设一个变量 , 可以是包含 的任何内容。 然后我们得到了这样的代码: 我可以在不生产 C/C 分支的情况下做到这一点吗? 我正在尝试优化一段代码。我想尽可能多地清除树枝。也有类似的判断,所以我想将它们转换为没有分支的语句,以使代码尽可能高效。