包装类与自动装箱
理解 Integer 缓存、自动装箱拆箱、进制转换
包装类与自动装箱
Java 的集合(如 List)只能存对象,不能直接存基本类型。包装类就是给每个基本类型套了个"对象壳",让 int 变成 Integer,可以放进集合。
学完本章你将: 理解装箱/拆箱、Integer 缓存池、字符串互转。
基本类型 → 包装类
java
// 8 种基本类型对应 8 种包装类
int → Integer // 最常用
long → Long
double → Double
boolean → Boolean
char → Character
byte → Byte
short → Short
float → Float
自动装箱与拆箱 —— 编译器帮你
java
// 自动装箱:基本类型自动变包装类(编译器自动调用 Integer.valueOf())
Integer n = 100; // 等价于 Integer n = Integer.valueOf(100);
// 自动拆箱:包装类自动变基本类型(编译器自动调用 intValue())
int m = n; // 等价于 int m = n.intValue();
// 运算中也会自动拆箱
Integer a = 10, b = 20;
System.out.println(a + b); // 30 —— 两个 Integer 自动拆箱为 int 再相加
⚠️ NullPointerException 陷阱: 如果包装类是 null,自动拆箱会抛 NPE!
javaInteger x = null; int y = x; // NPE!因为 x.intValue() 在 null 上调用
Integer 缓存池 —— 面试常考
java
// -128 ~ 127 之间的 Integer 被 JVM 缓存,复用同一对象
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true!取的是缓存池中同一个对象
Integer c = 200; // 超出缓存范围
Integer d = 200;
System.out.println(c == d); // false!各自 new 了新对象
// 始终用 equals 比较值!
System.out.println(c.equals(d)); // true ✅
字符串互转
java
// String → 基本类型
int num = Integer.parseInt("42");
double pi = Double.parseDouble("3.14");
boolean flag = Boolean.parseBoolean("true");
// 基本类型 → String
String s1 = String.valueOf(100);
String s2 = Integer.toString(200);
String s3 = 300 + ""; // 最简便
Integer a = 100; Integer b = 100; System.out.println(a == b); // true(缓存池中同一对象)
Integer c = 200; Integer d = 200; System.out.println(c == d); // false(超出缓存范围)
// 始终用 equals 比较值 System.out.println(c.equals(d)); // true ✅
---
## 实用方法
```java
// 进制转换
System.out.println(Integer.toBinaryString(42)); // "101010"
System.out.println(Integer.toHexString(255)); // "ff"
// 最大/最小值
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648
// null 安全比较
Integer x = null;
// x + 1; // ❌ NullPointerException
int result = x != null ? x : 0; // 安全使用