java包装类是8种基本类型封装为对象的桥梁,支持集合、泛型、null判断及工具方法;自动装箱/拆箱基于valueof()和xxxvalue();integer在-128~127范围缓存,比较须用equals()。

Java 中的包装类,是把 8 种基本数据类型 封装成对象的关键桥梁。它们让基本类型能进集合、用泛型、调方法、判 null,还能自动转换——但这些便利背后藏着容易踩坑的缓存机制,尤其是 Integer。
八大基本类型与对应包装类
每种基本类型都有唯一、固定、大小写敏感的包装类,全部在 java.lang 包下,无需 import:
- byte → Byte
- short → Short
- int → Integer(注意:不是 Int)
- long → Long
- float → Float
- double → Double
- char → Character(注意:不是 Char)
- boolean → Boolean
记忆技巧:除 int 和 char 对应的 Integer、Character 外,其余都是首字母大写;所有包装类都不可变(immutable),线程安全。
为什么必须用包装类?四个硬需求
基本类型功能有限,而包装类解决了实际开发中绕不开的四类问题:
- 集合框架(如
ArrayList<integer></integer>)只接受对象,不能写ArrayList<int></int> - 泛型参数必须是引用类型,
List<t></t>中的T不能是int - 基本类型默认值固定(如
int i默认为0),无法区分“未初始化”和“值为0”;包装类初始为null,语义更清晰 - 提供大量静态工具方法,例如:
Integer.parseInt("123")、Double.parseDouble("3.14")、Character.isLetter('a')
自动装箱与拆箱:编译器帮你写的“隐形代码”
从 JDK 5 开始支持,本质是编译期语法糖,运行时仍调用包装类的静态或实例方法:
-
自动装箱:基本类型 → 包装类,等价于调用
valueOf()方法
例如Integer i = 100;编译后实际是Integer i = Integer.valueOf(100); -
自动拆箱:包装类 → 基本类型,等价于调用
xxxValue()方法
例如int x = i;实际是int x = i.intValue(); - 常见陷阱:对
null包装类变量执行拆箱会抛NullPointerException
Integer 缓存机制:-128 到 127 是个“安全区”
Integer.valueOf(int) 并非每次都新建对象。JVM 默认缓存了 -128 到 127(含)之间的整数对象:
-
Integer a = 100; Integer b = 100;→a == b为 true(指向同一缓存对象) -
Integer c = 200; Integer d = 200;→c == d为 false(各自新建对象) - 这个范围可通过 JVM 参数
-Djava.lang.Integer.IntegerCache.high=xxx扩展(仅 high 可调,low 固定为 -128) - 其他包装类也有类似缓存(
Byte、Short、Long、Character),但只有Integer的范围可配置;Boolean缓存true/false两个常量;Float和Double不缓存
所以比较包装类对象,务必用 equals(),而不是 == —— 后者比的是引用,不是值。











