Java 中 int和 Integer的主要区别如下:
核心区别
| 特性 | int (基本类型) | Integer (包装类) |
|---|---|---|
| 类型 | 基本数据类型 | 类(引用类型) |
| 内存 | 栈内存存储值 | 堆内存存储对象 |
| 默认值 | 0 | null |
| 比较 | 用 == 比较值 | 用 equals() 比较值,== 比较引用 |
| 泛型 | 不能用于泛型 | 可用于泛型(如 List<Integer>) |
| 方法 | 无方法 | 提供丰富方法(如 parseInt、toString) |
自动装箱与拆箱(Java 5+)
// 自动装箱
Integer a = 100; // 编译器自动转换为 Integer.valueOf(100)
// 自动拆箱
int b = a; // 编译器自动转换为 a.intValue()
// 手动转换
Integer c = Integer.valueOf(200);
int d = c.intValue();
缓存机制
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true(缓存范围内)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false(超出缓存范围)
// Integer 默认缓存 -128 到 127
// 可通过 JVM 参数调整上限
设计包装类的原因
1. 面向对象一致性
Java 是面向对象语言,包装类让基本类型也能以对象形式参与:
// 可以放入集合
List<Integer> list = new ArrayList<>();
list.add(10); // 基本类型 10 自动装箱为 Integer
// 可以调用方法
Integer num = 10;
String str = num.toString(); // 转换为字符串
int hex = Integer.parseInt("1A", 16); // 解析为十六进制
2. 泛型支持
Java 泛型只支持引用类型:
// List<int> list; // 编译错误
List<Integer> list; // 正确
3. 表示空值
Integer score = null; // 可以表示"未设置"
// int score = null; // 编译错误
4. 提供工具方法
// 各种转换和判断
Integer.max(10, 20);
Integer.bitCount(15); // 计算二进制中1的个数
Integer.toBinaryString(10); // 转为二进制字符串
5. 序列化支持
包装类实现了 Serializable 接口,可以序列化:
public class Student implements Serializable {
private Integer id; // 可序列化
// private int id; // 也可以,但某些框架需要对象
}
使用建议
- 性能考虑用 int
// 循环中使用基本类型
for (int i = 0; i < 1000000; i++) {
// 使用 int 避免装箱开销
}
- 需要对象特性用 Integer
// 放入集合
Map<String, Integer> map = new HashMap<>();
// 需要 null 值
Integer result = calculate();
if (result != null) {
// 处理
}
- 比较注意事项
Integer a = 1000;
Integer b = 1000;
a == b; // false,比较引用
a.equals(b); // true,比较值
a.intValue() == b.intValue(); // true
历史背景
- Java 1.0 只有包装类,操作繁琐
- Java 5 引入自动装箱/拆箱,简化代码
- 保持向后兼容,同时提高效率
总结:int是基本类型,追求性能;Integer是包装类,提供对象特性和工具方法。根据场景选择,现代 Java 中自动装箱/拆箱让两者切换更自然。