
Java里哪些类型有对应的包装类
Java的8个基本数据类型,每个都配一个不可变的引用类型包装类,它们全在 java.lang 包里,不用导包就能用。
-
byte→Byte -
short→Short -
int→Integer -
long→Long -
float→Float -
double→Double -
char→Character -
boolean→Boolean
注意:void 没有包装类;Integer 等类名首字母大写是强制规范,写成 integer 会编译失败。
装箱和拆箱到底什么时候发生
自动装箱(autoboxing)和自动拆箱(unboxing)只在“基本类型 ↔ 对应包装类”之间隐式转换时触发,不是所有类型转换都算。
- 装箱:比如把
int赋值给Integer变量,或传给接收Integer的方法参数 - 拆箱:比如把
Integer当作int用在算术表达式里,或调用intValue()以外的隐式转换 - 不触发:
Integer转Object是向上转型,不算装箱;int转long是基本类型提升,也不算装箱
常见错误现象:NullPointerException 很可能来自对 null 的 Integer 做拆箱——比如 Integer x = null; int y = x; 运行时报错,不是编译错。
立即学习“Java免费学习笔记(深入)”;
缓存机制让 == 判断变得危险
Integer、Byte、Short、Character 和 Long 在一定范围内会复用对象实例,但具体范围不同,直接用 == 比较值是否相等极易出错。
-
Integer缓存范围是-128到127(可由 JVM 参数-Djava.lang.Integer.IntegerCache.high扩展) -
Byte、Short、Long固定缓存-128 ~ 127 -
Character缓存'\u0000'到'\u007f'(即 ASCII 0–127) -
Float和Double从不缓存;Boolean只有两个实例,所以Boolean.TRUE == Boolean.TRUE总是 true
示例:Integer a = 127; Integer b = 127; System.out.println(a == b); // true;但换成 128 就是 false。安全做法永远用 .equals() 或先拆箱再比。
性能与兼容性要注意的细节
装箱/拆箱不是免费的,尤其在循环或高频调用场景下,对象创建和 GC 开销明显。
- 避免在
for循环里反复装箱:比如list.add(i)(i是int,list是List<integer></integer>) - 泛型容器只能存引用类型,所以
ArrayList<int></int>合法语法都不允许,必须用ArrayList<integer></integer> - Android 上低版本(如 API 21 以前)对自动装箱优化较差,
Integer.valueOf(x)比x直接赋值略慢,但差距通常可忽略 - 如果确定数值在缓存范围内,显式调用
valueOf()(如Integer.valueOf(42))比new Integer(42)更好——后者总是新建对象,且自 Java 9 起已标记为@Deprecated
最容易被忽略的是:泛型擦除后,集合里的 Integer 在运行时就是 Object,而拆箱动作发生在字节码层面(invokevirtual Integer.intValue),一旦对象为 null,异常抛出位置可能离原始代码很远,排查时别只盯逻辑,先查空值来源。










