Byte、Short、Long 的常量池范围均为[-128, 127],自动装箱时复用池中实例,new构造则总新建对象;==比较仅在同类型且值在此区间内才为true;三者常量池相互独立,不共享对象。

Byte、Short、Long 的常量池范围一致
这三种整数包装类都实现了常量池机制,缓存区间统一为 [-128, 127](含两端)。超出该范围的值,每次装箱都会新建对象;落在区间内,则复用常量池中已有的实例。
常量池行为只在自动装箱时生效
以下写法会走常量池:
-
Byte b1 = 100; → 调用
Byte.valueOf(100) -
Short s1 = -50; → 调用
Short.valueOf(-50) -
Long l1 = 127L; → 调用
Long.valueOf(127L)
而显式使用 new 构造则绕过常量池,无论数值大小:
- Byte b2 = new Byte((byte)100); → 总是新建对象
- Long l2 = new Long(127L); → 总是新建对象
== 比较结果取决于是否共用常量池
同类型变量在 [-128, 127] 内自动装箱后,== 判断返回 true(地址相同);超出范围则返回 false(地址不同):
- Byte b1 = 100, b2 = 100; System.out.println(b1 == b2); // true
- Long l1 = 200L, l2 = 200L; System.out.println(l1 == l2); // false
注意:Byte 和 Short 之间、或与 Integer 之间不能直接用 == 比较,编译报错——类型不兼容,不会触发自动拆箱。
三者常量池相互独立,不共享
虽然范围都是 [-128, 127],但 Byte.valueOf(100)、Short.valueOf(100)、Long.valueOf(100L) 返回的是不同类型对象,内存地址不同,哈希值可能巧合相同,但绝非同一对象。
例如:Byte b = 100; Short s = 100;,b.equals(s) 返回 false(类型不同),b == s 编译不通过。

















