Java 基础的面试高频02:int 与 Integer 深度解析:包装类、自动装箱拆箱、Integer 缓存机制

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

🎊 相关推荐

微信如何发送语音文件
365体育外围

微信如何发送语音文件

📅 01-07 👀 3997
手机铃声制作简易指南:MP3截歌工具使用教程
什么样的耳机最不伤耳朵?目前最不伤耳的骨传导耳机