int vs. Integer
要明确两者的根本区别:

-
int(Primitive Type - 基本数据类型)- 它是一个原始数据类型,不是一个对象。
- 它存储的是实际的值(
10,-200,0)。 - 它的变量直接存储在栈内存中,速度非常快。
- 它不能为
null,一个int变量必须有一个值。
-
Integer(Wrapper Class - 包装类)- 它是一个对象,是
int的包装类。 - 它内部包含一个
int类型的值。 - 它存储在堆内存中。
- 它可以为
null,表示“没有值”或“未知值”,这在处理数据库字段、可选参数等场景时非常有用。
- 它是一个对象,是
转换方法
int 转 Integer (基本类型 -> 对象)
这个过程在 Java 5 之后被称为自动装箱。
自动装箱 (推荐)
当 Java 编译器发现你需要一个 Integer 对象,但你给了一个 int 值时,它会自动为你完成转换。

// 1. 直接赋值
int primitiveInt = 100;
Integer integerObject = primitiveInt; // 自动装箱发生
System.out.println("integerObject 的值: " + integerObject); // 输出: 100
System.out.println("integerObject 的类型: " + integerObject.getClass().getName()); // 输出: java.lang.Integer
// 2. 在方法调用中
someMethod(50); // 50 会被自动装箱成 Integer 传递给方法
public static void someMethod(Integer i) {
System.out.println("接收到 Integer: " + i);
}
显式构造 (不推荐,已过时)
在 Java 5 之前,你需要手动调用构造函数来创建 Integer 对象,虽然现在仍然可以工作,但这种写法已经过时,因为自动装箱更简洁。
int primitiveInt = 200; Integer integerObject = new Integer(primitiveInt); // 显式构造,不推荐 System.out.println(integerObject); // 输出: 200
Integer 转 int (对象 -> 基本类型)
这个过程在 Java 5 之后被称为自动拆箱。
自动拆箱 (推荐)
当 Java 编译器发现你需要一个 int 值,但你给了一个 Integer 对象时,它会自动为你完成转换。
Integer integerObject = 300;
int primitiveInt = integerObject; // 自动拆箱发生
System.out.println("primitiveInt 的值: " + primitiveInt); // 输出: 300
// 在计算中
Integer a = 10;
Integer b = 20;
int sum = a + b; // a 和 b 都会被自动拆箱为 int,然后进行加法运算
System.out.println("sum 的值: " + sum); // 输出: 30
显式调用 .intValue() 方法
这是手动拆箱的方式,在需要明确表达意图或者在某些特殊情况下会用到。

Integer integerObject = 400;
int primitiveInt = integerObject.intValue(); // 显式调用 intValue() 方法
System.out.println("primitiveInt 的值: " + primitiveInt); // 输出: 400
重要注意事项和陷阱
NullPointerException (空指针异常)
这是自动拆箱时最常见的错误,如果一个 Integer 对象是 null,当你尝试自动拆箱它时,程序会抛出 NullPointerException。
Integer nullableInteger = null; // Integer 可以为 null
// 下面的代码会抛出 NullPointerException
int value = nullableInteger; // 尝试将 null 拆箱为 int
// 正确的做法是先检查是否为 null
if (nullableInteger != null) {
int value = nullableInteger;
System.out.println("Value is: " + value);
} else {
System.out.println("Value is null, cannot convert to int.");
}
缓存范围 (Cache Range)
Integer 类有一个静态缓存池(IntegerCache),它会缓存 -128 到 127 之间的 Integer 对象,这意味着:
- 通过
new Integer(i)或自动装箱创建的[-128, 127]范围内的Integer对象,如果值相同,它们实际上是同一个对象( 比较为true)。 - 超出这个范围的
Integer对象,即使值相同,也是不同的对象( 比较为false)。
Integer a = 100; Integer b = 100; System.out.println(a == b); // 输出 true,因为 100 在缓存池中 Integer c = 200; Integer d = 200; System.out.println(c == d); // 输出 false,因为 200 超出了缓存池范围 // 使用 valueOf() 方法会考虑缓存 Integer e = Integer.valueOf(100); Integer f = Integer.valueOf(100); System.out.println(e == f); // 输出 true Integer g = Integer.valueOf(200); Integer h = Integer.valueOf(200); System.out.println(g == h); // 输出 false
最佳实践:在需要创建 Integer 对象时,优先使用 Integer.valueOf(),而不是 new Integer(),因为它可以利用缓存,提高性能和减少内存占用,自动装箱 int 到 Integer 时,JVM 底层调用的就是 Integer.valueOf()。
总结表格
| 转换方向 | 推荐方法 (Java 5+) | 底层实现/原理 | 示例 |
|---|---|---|---|
int -> Integer |
自动装箱 | 调用 Integer.valueOf(int) |
int i = 10; Integer I = i; |
Integer -> int |
自动拆箱 | 调用 Integer.intValue() |
Integer I = 10; int i = I; |
String -> int |
Integer.parseInt() |
将字符串解析为 int 原始类型 |
int i = Integer.parseInt("123"); |
int -> String |
String.valueOf() |
将 int 值转换为字符串 |
String s = String.valueOf(123); |
希望这个详细的解释能帮助你完全理解 Java 中 int 和 Integer 的转换!
