热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

System.identityHashCode()对原语的行为

如何解决《System.identityHashCode()对原语的行为》经验,为你挑选了1个好方法。

在jvm imgui中,我正在使用

System.identityHashCode(i++)

哪里

var i = 0

为每个帧始终为给定对象生成一个常数id(因此
可以对其进行跟踪)

但是,一个用户案例只是告诉我,这仅对中的值有效[0, 125]

尝试调试并查找错误,我结束了这段简短的代码测试:

    var i = 0
    val A = Array(256, { System.identityHashCode(i++) })
    i = 0
    val B = Array(256, { System.identityHashCode(i++) })
    repeat(256) {
        if (A[it] != B[it])
            println("[$it] different, A ${A[it]}, B ${B[it]}")
    }

还有:

字节(完全正常工作,对于所有256个值,A == B)

短裤(不能从128开始工作)

整数(从128开始无效)

多头(不能从128开始工作)

浮动(完全不起作用)

加倍(根本不起作用)

这是为什么?

我是否可以安全地假设这种行为在其他平台上也能保持一致?



1> Gray..:

但是,一个用户案例只是告诉我,这仅对[0,125]中的值有效

System.identityHashCode(Object)采用Object非原语,这意味着您将i++被自动装箱为Integer(或Long或...)。对象具有相同身份哈希码的唯一时间是(但并非总是)当它们是同一对象时。碰巧的是,JVM Integer为了优化目的而缓存了少量的s,这意味着0到127值的标识哈希码是相同的。

自动装箱发生时,编译器会生成的调用Integer.valueOf(int)。如果我们看一下`valueOf(...)的代码,我们会看到:

if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);

因此,存在一个低缓存范围和一个高缓存范围,您将从中获得一个在JVM启动时生成的缓存常量对象。有JVM参数会影响数字高速缓存的大小。因此127必须在您的JVM的缓存范围内,而128以上的版本不在。

// both of the 100 values gets auto-boxed to the same Integer object
System.identityHashCode(100) == System.identityHashCode(100)

这基本上等效于比较同一对象的哈希码:

Integer i = new Integer(100);
System.identityHashCode(i) == System.identityHashCode(i)

一旦超过了初始缓存的Integer值集并指定了更大的int值,新的Integer对象将在自动装箱后创建,因此(很可能)标识哈希码不再相等。

// by default, each of these 1000000 values gets auto-boxed to a different object
System.identityHashCode(1000000) != System.identityHashCode(1000000)

这基本上等效于实例化2个不同的整数,并期望它们的哈希码相同:

Integer i1 = new Integer(1000000);
Integer i2 = new Integer(1000000);
System.identityHashCode(i1) != System.identityHashCode(i2)

请注意,System.identityHashCode(...)不会返回唯一值,因此,当查看不同的对象时,它们有可能(尽管不太可能)生成相同的值。


推荐阅读
  • 微信公众号:内核小王子关注可了解更多关于数据库,JVM内核相关的知识;如果你有任何疑问也可以加我pigpdong[^1]jvm一行代码是怎么运行的首先,java代码会被编译成字 ... [详细]
  • 探索equals()和hashCode()方法  在根类Object中,实现了equals()和hashCode()这两个方法,默认:  equals()是对两个对象的地址值进行的比较(即比较引用是否 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 子类从父类继承所有的成员(字段,方法,嵌套类),构造方法不属于成员,所有子类不能继承,但是子类可以调用父类的构造方法对于private方法和属性,子类一定是继承了的,但是没有访问权 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
  • 一、equals方法的作用1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Objec ... [详细]
  • 转载请注明出处:http:blog.csdn.netsupera_liarticledetails45034203Effectivejava系列1.Effectivejav ... [详细]
  • 讲下equals和hashcode,他们为何必须一起重写?hashcode方法重写规则。
    讲下equals和hashcode,他们为何必须一起重写?hashcode方法重写规则。-1、equals和hashCode(哈希码)是什么? 两个都是Object类的方法equ ... [详细]
  • Whenoverridingtheequals()functionofjava.lang.Object,thejavadocssuggestthat,当重写java.lang. ... [详细]
  • 1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.为什么改写equals()的时候,总是要改写hashCode()两个原则:hashCode()的返回& ... [详细]
  • -------------------------------------------------android培训、java培训期待与您交流!--------------------------- ... [详细]
author-avatar
自由战狼2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有