一、基础定义
int
Java 8 种基本数据类型(原始类型 primitive type) 之一
占用内存:4 字节(32 位)
取值范围:-2³¹ ~ 2³¹-1 → -2147483648 ~ 2147483647
Integer
引用类型(包装类),java.lang.Integer
是 int 的对象封装,内部持有 private final int value;
对象,存在堆内存,占用更大内存
补:Java 八种基本类型与对应包装类
byte→Byte、short→Short、int→Integer、long→Long
float→Float、double→Double、char→Character、boolean→Boolean
二、核心区别
- 默认值不同
// 作为类成员变量classTest{inta;Integerb;}int a 默认值:0
Integer b 默认值:null
2. 能否为 null
int:绝对不能赋值 null,编译报错
Integer:可以是 null
做接口数据传输的时候要注意:如果前端不传字段 → 框架赋值 null,用 int 直接抛出类型转换异常。
3. 内存存放位置
int:
局部变量 → 栈内存;对象成员变量跟着对象在堆,但数值是原始值。
没有对象头,只存纯粹数值,开销极小。
Integer:
是对象,实例存放在堆内存;包含对象头、成员 value,内存开销远大于 int。
4. == 判断规则(高频坑!重点)
① int 和 int 比较
直接比较数值
inta=100;intb=100;System.out.println(a==b);// true② Integer 和 Integer 使用 ==
这里涉及 Integer 缓存池(IntegerCache)
Integer 默认缓存 -128 ~ 127 之间的对象。
Integeri1=100;Integeri2=100;System.out.println(i1==i2);// true 命中缓存Integeri3=200;Integeri4=200;System.out.println(i3==i4);// false 超出缓存,新建两个对象所以Integer 对象比较数值永远使用 .equals()。
③ int 和 Integer 混合 ==
Integer 会自动拆箱成 int,只比较数值
但是,如果Integer是null则自动拆箱会空指针
Integera=null;intb=10;if(a==b){}// NullPointerException!// 执行逻辑:a.intValue() 拆箱,null调用方法空指针- 自动装箱 & 自动拆箱(JDK1.5 + 特性)
装箱:int → Integer
Integer num = 10; 等价于 Integer num = Integer.valueOf(10);
拆箱:Integer → int
int n = num; 等价于 int n = num.intValue();
所有拆箱操作,如果 Integer 为 null → 空指针异常!
补:不推荐混搭!!!