Java 基础的面试高频02:int 与 Integer 深度解析:包装类、自动装箱拆箱、Integer 缓存机制
int和Integer是 Java 面试必问高频考点,十场面试八场会问到,也是很多人最容易踩坑的知识点。很多同学只知道前者是基本数据类型、后者是包装类,一旦问到自动装箱拆箱原理、Integer缓存范围-128~127的底层细节,就很容易答错。今天我们从设计初衷到底层源码,一次性讲透这个高频面试点。
一、为什么需要包装类?
Java 是面向对象语言,但 8 种基本数据类型(byte/short/int/long/float/double/char/boolean)不属于对象,没有属性和方法,存在两个痛点:
-
集合容器(List、Map)只能存储对象,无法直接存放基本数据类型;
-
基本类型无法为 null,不能表达 “空值” 场景,比如数据库字段可能为 NULL。
所以 Java 为每一种基本类型提供了对应的包装类,把基本数据类型封装成对象,既可以存入集合,也可以赋值为 null。
int ↔ Integer ;char ↔ Character;其余基本类型首字母大写即为包装类
二、自动装箱与自动拆箱原理
1. 概念定义
-
装箱:基本类型 → 包装类,int a = 10; Integer num = a;
-
拆箱:包装类 → 基本类型,Integer num = 10; int a = num;
-
从 Java5 开始引入自动装箱、自动拆箱特性,编译器会在编译阶段自动补充转换代码,不需要手动调用Integer.valueOf()、integer.intValue()。
2. 底层源码本质
-
自动装箱:底层调用Integer.valueOf(int i)方法;
-
自动拆箱:底层调用包装类的intValue()方法;
这也是缓存机制生效的核心入口,所有直接赋值的装箱操作都会进入valueOf方法。
三、Integer 缓存机制:为什么范围是 - 128~127?
1. 缓存源码逻辑
Integer内部维护了一个静态常量数组IntegerCache[],在类加载时,提前缓存了-128到127之间所有 Integer 对象。
当我们使用Integer.valueOf()装箱时:
-
如果数值在[-128,127]区间,直接从缓存数组中返回已有对象,不会 new 新对象;
-
如果超出区间,会new Integer(数值)创建全新对象。
2. 经典面试代码踩坑演示
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true,命中缓存,同一个对象
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false,超出缓存,两个不同new的对象
Integer e = new Integer(100);
Integer f = 100;
System.out.println(e == f); // false,手动new一定创建新对象,不走缓存
3. 为什么缓存上限固定 127,下限 - 128?
字节的取值范围正好是-128 ~ 127,日常开发中小数字使用频率极高,缓存常用数字可以频繁复用对象,减少频繁创建销毁对象带来的内存开销,提升程序性能。
四、面试高频易错点总结
-
int是基本类型,默认值 0;Integer是引用类型,默认值 null;
-
包装类和基本类型用==比较时,包装类会自动拆箱为基本类型,只对比数值;
-
只有自动装箱(直接赋值)才会走缓存,new Integer()永远不会使用缓存;
-
业务开发中推荐使用Integer接收接口、数据库数值,方便处理空值场景。

浙公网安备 33010602011771号