Java 常用类|包装类 装箱拆箱、Integer 缓存面试题

一、引入

  1. 目的:让Object可以统一管理所有类型的数据。
  2. 包装类:基本数据类型所对应的对象类型,称为基本数据类型的包装类。

二、基本数据类型与包装类对应关系

  • 所有包装类都在java.lang包下,不需要手动导包。
  • 包装类全部被final修饰,没有子类。

表格

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

三、数据类型之间转换(以 Integer 为例)

3.1 int ↔ Integer

int 转 Integer
复制代码
int a = 12;
// 方式1:构造方法
Integer i1 = new Integer(a);
// 方式2:静态方法 valueOf()
Integer i2 = Integer.valueOf(a);
Integer 转 int
复制代码
// 成员方法 intValue()
int n = i2.intValue();

3.2 String ↔ Integer

String 转 Integer
复制代码
String str = "222";
// 方式1:构造方法
Integer i3 = new Integer(str);
// 方式2:静态方法 valueOf()
Integer i4 = Integer.valueOf(str);
Integer 转 String
复制代码
// 方式1:toString()
String s1 = i4.toString();
// 方式2:字符串拼接
String s2 = i4 + "";

四、int ↔ String 互相转换

int 转 String

复制代码
int a2 = 32;
// 字符串拼接方式
String s3 = a2 + "";

String 转 int(开发重点)

复制代码
String a = "18";
int age = Integer.parseInt(a);

⚠️注意: String 转为 Integer/int 时,字符串内容必须是纯数字,且不能超出 Integer 数值范围。 编译可以通过,运行时报异常:java.lang.NumberFormatException 数值格式转换异常。

五、自动装箱与自动拆箱

JDK5.0 新增特性,基本数据类型和对应包装类可以自动互相转换。

  • 装箱:基本数据类型 → 包装类型

  • 拆箱:包装类型 → 基本数据类型

    // 自动装箱 int → Integer
    Integer i1 = 12;

    // 自动拆箱 Integer → int
    int a = i1;

自动装箱底层原理

自动装箱底层 JVM 调用Integer.valueOf(int n)完成转换。 valueOf核心源码:

复制代码
public static Integer valueOf(int i){
    if(i >= -128 && i <= 127){
        return IntegerCache.cache[i+(-IntegerCache.low)];
    }
    return new Integer(i);
}

源码解读:

  • 如果数值在 -128 ~ 127 区间:直接从**Integer 缓冲区(缓存池)**返回对象。
  • 如果数值不在该区间:new Integer(i)新建对象。

缓冲区作用

Integer 预先把‑128~127范围内的包装对象缓存,存放在缓冲区。 目的:提高装箱效率,提升 JVM 内存利用率。

📝面试题:分析输出结果

复制代码
Integer i1 = 12;
Integer i2 = 12;
System.out.println(i1 == i2); // true

Integer i3 = 255;
Integer i4 = 255;
System.out.println(i3 == i4); // false

解析: 12 属于‑128~127缓存范围,i1、i2 指向缓存中同一个对象,==比较地址为 true。 255 超出缓存范围,两次装箱new两个不同对象,地址不一样,==结果 false。

六、包装类实际开发应用

  1. 使用场景:实体类属性,把基本数据类型替换为对应的包装类型。
  2. 目的:区分有效数据与无效数据。

举例:基本类型 int 默认值为 0,无法区分 "真实数值 0" 和 "没有赋值"; Integer 包装类默认值为null,null 代表未赋值,0 代表真实业务数值。

相关推荐
杨杨杨大侠2 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
EatFan2 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
LOVE️YOU3 小时前
Python 在定义函数时,究竟定义的是什么?
python
Maiko Star3 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
段一凡-华北理工大学3 小时前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客3 小时前
以撒的结合
python·游戏·电脑·娱乐
Circ.3 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
风早爽太4 小时前
用 ‌Render‌ 快速部署网站和常见问题解决
python·fastapi
现任明教教主~5 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
李航19835 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程