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 代表真实业务数值。

相关推荐
Orange_sparkle1 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
2601_962099461 小时前
Python xlwt设置excel单元格字体及格式
python·excel·xlwt·样式设置·单元格格式
奇牙coding1231 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
2601_962298272 小时前
Python与Selenium结合的Web自动化测试全流程实践教程
自动化测试·python·selenium·web测试·pageobjectmodel
天衍四九-2 小时前
第一章:从 LLM 到 Agent —— DeepSeek Harness 入门
网络·数据库·人工智能·python
529宝宝起名网2 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
2601_962298672 小时前
Python:对象缓存优化机制(CPython)
python·性能优化·内存优化·cpython·对象缓存
Wang's Blog3 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
谢尔登3 小时前
01_Java基础速通
java·开发语言