int和Integer的区别
Java是面向对象的语言,一切操作都以对象为基础,像集合里面也只支持存储Object类型数据,普通类型无法通过集合存储,
在Java中,int
和Integer
是两种不同的类型,它们有以下主要区别:
一、类型分类
-
int
:是Java的基本数据类型(primitive type),它是一个32位的有符号整数,直接存储数值。 -
Integer
:是int
的包装类(wrapper class),它是一个对象,继承自Object
类,用于将基本数据类型int
封装为一个对象。里面提高了有很多方法和属性,使用时更加灵活。
二、存储方式
-
int
:直接存储在栈空间里 -
Integer
:存储在堆内存里,因为他是个对象
三、内存占用
-
int
:占用4字节(32位)的内存空间。 -
Integer
:占用的内存空间比int
大,因为它是一个对象,除了存储数值外,还包含对象的元数据(如类信息、锁信息等)。
四、默认值
-
int
:默认值是0
。 -
Integer
:默认值是null
(如果声明为局部变量且未初始化,会报编译错误)。
五、操作性能
-
int
:操作性能高,因为它直接操作数值,没有对象的开销。 -
Integer
:操作性能相对较低,因为它涉及到对象的创建和引用操作。
六、自动装箱和拆箱(Autoboxing and Unboxing)
从Java 5开始,引入了自动装箱(autoboxing)和自动拆箱(unboxing)机制,使得int
和Integer
之间的转换更加方便。例如:
Integer a = 10; // 自动装箱,将int值10自动转换为Integer对象
int b = a; // 自动拆箱,将Integer对象a自动转换为int值
-
自动装箱:将
int
值自动转换为Integer
对象。 -
自动拆箱:将
Integer
对象自动转换为int
值。
七、使用场景
-
int
:适用于需要高性能、内存占用小的场景,特别是在处理大量数据或性能敏感的代码中。 -
Integer
:适用于需要将整数作为对象处理的场景,例如:-
存储在集合中(如
List<Integer>
)。 -
使用泛型时(如
ArrayList<Integer>
)。 -
使用反射或动态类型检查时。
-
八、空值处理
-
int
:不能表示空值,因为它是一个基本数据类型,必须有一个具体的数值。 -
Integer
:可以表示空值,因为它是对象,可以为null
。例如:Integer a = null; // 合法 int b = null; // 编译错误
九、总结
-
int
:适用于需要高性能和内存效率的场景。 -
Integer
:适用于需要将整数作为对象处理的场景,如集合操作、泛型、空值处理等。
在实际开发中,根据具体需求选择合适的类型。如果不需要将整数作为对象处理,建议使用int
以提高性能和内存效率。如果需要将整数作为对象处理,或者需要使用集合、泛型等特性,则使用Integer
。
装箱拆箱
这里本身Java的集合是没法存储非Object类的,但这里int自动装箱成了Integer对象,就可以了。