包装类的hashcode基于封装的基本值计算,与对象地址无关:boolean返回1231/1237;byte/short/character/integer直接返回基本值;long用高低32位异或;float和double按ieee 754规范转换后取整。

Java中包装类的 hashCode 是根据其**封装的基本值**直接计算得出的,不是基于对象地址,也不依赖运行时状态——每个包装类都有明确、确定、与值一一对应的哈希算法。
各包装类的 hashCode 计算方式
每种包装类重写了 Object.hashCode(),实现逻辑简单且稳定:
- Boolean:true → 1231,false → 1237(两个质数,降低哈希冲突概率)
-
Byte / Short / Character / Integer:直接返回其基本值(
byteValue()、charValue()等),即(int)value -
Long:将 long 值拆成高低 32 位,做异或运算:
(int)(value ^ (value >>> 32)) -
Float:调用
Float.floatToIntBits(value),把 float 按 IEEE 754 转为 int 再返回 -
Double:先转为 long(
Double.doubleToLongBits(value)),再按 Long 的方式异或后取低 32 位
为什么这样设计?
这种设计严格遵循 equals-hashCode 合约:只要两个包装类对象 equals() 返回 true,它们的 hashCode() 就一定相同。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Integer.valueOf(100)和new Integer(100)值相等 →hashCode()都是 100 -
Boolean.TRUE.equals(Boolean.TRUE)→ 两者hashCode()都是 1231
这也保证了包装类在 HashSet、HashMap 中能正确去重和查找——值相同,哈希一致,自然落在同一个桶里。
注意缓存不影响 hashCode 计算
比如 Integer.valueOf(100) 可能复用缓存对象,而 new Integer(100) 总是新建对象,但二者 hashCode() 结果完全一样。因为哈希值只取决于数值本身,与是否共享实例无关。
对比默认 Object.hashCode()
未重写的 Object.hashCode() 是 native 方法,通常与对象内存地址或 JVM 分配策略相关,每次运行可能不同,且同一对象多次调用结果一致。而包装类彻底抛弃了地址依赖,转向纯值语义——这是“不可变值对象”应有的行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










