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接收接口、数据库数值,方便处理空值场景。

posted @ 2026-07-01 22:49  桃桃不淘1  阅读(0)  评论(0)    收藏  举报