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

相关推荐
“AI国潮设计-小江”1 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞树莓香草布丁”IP,附保持角色一致性的代码逻辑》
开发语言·人工智能·python·prompt·aigc
const_qiu1 分钟前
第四章 06:4.6 统一入口 —— analyze() 能力收束
java·人工智能
溪语流沙15 分钟前
【Web全栈进阶】文件上传与图片展示:早报站的第一张图片
前端·vue.js·python·fastapi
川石课堂软件测试17 分钟前
JMeter异步接口测试实战
数据库·python·jmeter·mysql·kubernetes·测试用例·prometheus
aichitang202421 分钟前
Meta Muse Spark Open:816B 巨型开放权重多模态 Agent 模型架构、部署实战与社区首测全解
大数据·人工智能·python·算法·ai·架构·spark
有同事要进步23 分钟前
leecode每日一题 第66题:加1
python
她的男孩27 分钟前
JAR 全对仍 checksum mismatch:Forge Admin 把 Flyway 从 filesystem 改成 classpath
java·数据库·spring boot
鬼手点金28 分钟前
如何选择模型
java·前端·人工智能·git·深度学习
小马不起床31 分钟前
Django 后端实战指南_16:动作分类、动作库、动作收藏查询接口
数据库·python·django
ycydynq34 分钟前
django搜索功能
数据库·python·django