在Java中,`int` 和 `Integer` 是两个不同的类型,尽管它们都用于表示整数。主要的区别在于 `int` 是 `基本数据类型`,`Integer` 是 `包装类`
● 基本数据类型 vs 包装类
● `int` 是Java中的基本数据类型,直接存储数值,不能为 null ,并且在栈上分配内存,性能较高
● `Integer` 是 `int` 的包装类,属于引用类型,可以为 null ,是对象,在堆上分配内存,性能较低
● 默认值
● `int` 默认值是 0
● `Integer` 默认值是 null
● 内存分配
● `int` 存储在栈内存中,性能较好,占用4字节
● `Integer` 对象存储在堆内存中,需要额外的内存空间和开销来管理对象
● null 值处理
● `int` 不能为 null ,只能为一个有效的整数(如 0 、正数、负数等)
● `Integer` 可以为 null ,适合用来表示未赋值或缺失的值
int number = null; //编译错误,int不能为null
Integer number = null; //编译正确
● 用法场景
● `int` 更常用于高效数值计算的场景,因为它没有额外的对象开销
● `Integer` 通常用于需要处理 null 值的场景,或与泛型、集合类(如 List<Integer> )一起使用时,因为Java的集合类只支持对象类型
● 自动装箱与拆箱
Java提供了自动装箱和拆箱的机制,允许 `int` 和 `Integer` 之间的自动转换:
● 装箱:将基本类型 `int` 自动转换为 `Integer` 对象
● 拆箱:将 `Integer` 对象自动转换为 `int` 基本类型
Integer integerObj = 10; //自动装箱 (int -> Integer)
int intVal = integerObj; //自动拆箱 (Integer -> int)
● 比较方式
● `int` 使用 `==` 比较值是否相等
● `Integer` 既可以用 `==` 比较引用地址,也可以使用 `.equals()` 来比较值是否相等
● 注意:使用 `==` 比较两个 `Integer` 对象时,可能会得到错误结果,因为它比较的是对象的内存地址而不是值
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); //false 因为它们是不同的对象
System.out.println(a.equals(b)); //true 因为它们的值相等
int x = 1000;
int y = 1000;
System.out.println(x == y); //true 因为它比较的是值
需要注意的是,当 `Integer` 的值在 -128~127范围时, `==` 也可能返回 `true` ,因为Java会缓存这个范围内的整数对象
● 适用于泛型
● `int` 不能用于泛型类型整数
● `Integer` 可以用于泛型,例如在 `List<Integer>` 中使用
List<Integer> list = new ArrayList<>();
list.add(10); //只能使用Integer,不能使用int
总结
● `int` 是高效的基本数据类型,适合在不需要表示 null 或使用对象特征的情况下使用
● `Integer` 是包装类,适用于需要表示 null 、使用泛型或对象操作的场景,但性能略低
标签:Java,int,区分,数据类型,对象,Integer,null From: https://blog.csdn.net/m0_74952561/article/details/142391230