java Integer和int有什么区别,为什么要设计封装类?

Java 中 intInteger的主要区别如下:

核心区别

特性int (基本类型)Integer (包装类)
类型基本数据类型类(引用类型)
内存栈内存存储值堆内存存储对象
默认值0null
比较用 == 比较值用 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;   // 也可以,但某些框架需要对象
}

使用建议

  1. 性能考虑用 int
// 循环中使用基本类型
for (int i = 0; i < 1000000; i++) {
    // 使用 int 避免装箱开销
}
  1. 需要对象特性用 Integer
// 放入集合
Map<String, Integer> map = new HashMap<>();

// 需要 null 值
Integer result = calculate();
if (result != null) {
    // 处理
}
  1. 比较注意事项
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 中自动装箱/拆箱让两者切换更自然。


作 者:南烛
链 接:https://www.itnotes.top/archives/911
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇