三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Integer和int的基础区别

Integer和int的基础区别

一、基础定义
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
二、核心区别

  1. 默认值不同
// 作为类成员变量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调用方法空指针
  1. 自动装箱 & 自动拆箱(JDK1.5 + 特性)
    装箱:int → Integer
    Integer num = 10; 等价于 Integer num = Integer.valueOf(10);
    拆箱:Integer → int
    int n = num; 等价于 int n = num.intValue();
    所有拆箱操作,如果 Integer 为 null → 空指针异常!
    补:不推荐混搭!!!
← 返回列表