Java 中 String 转 Integer 的方法与底层原理详解

✨ 一、常见的转换方式

Java 中将 String 转为 Integer(或 int)常用三种方式:

java 复制代码
String str = "123";

// 方法1:使用 Integer.parseInt()
int num1 = Integer.parseInt(str);

// 方法2:使用 Integer.valueOf()
Integer num2 = Integer.valueOf(str);

// 方法3:使用 new Integer()(不推荐)
Integer num3 = new Integer(str); // 已过时,不推荐

🔍 二、三种方式的区别

方法 返回类型 是否装箱 是否推荐 原理说明
parseInt int ❌ 无自动装箱 ✅ 推荐 内部直接解析字符串成 int
valueOf Integer ✅ 自动装箱 ✅ 推荐 实际调用了 parseInt() 并进行装箱
new Integer(str) Integer ✅ 装箱 ❌ 不推荐 每次 new 一个对象,不走缓存机制,性能差

🧠 三、底层原理解析(重点)

我们重点来看看 Integer.parseInt(String) 的源码和原理:

🔧 源码分析(简化)

java 复制代码
public static int parseInt(String s) throws NumberFormatException {
    if (s == null) {
        throw new NumberFormatException("null");
    }

    int result = 0;
    boolean negative = false;
    int i = 0, len = s.length();

    // 处理负号
    char firstChar = s.charAt(0);
    if (firstChar == '-') {
        negative = true;
        i++;
    }

    while (i < len) {
        int digit = s.charAt(i++) - '0';  // 将字符 '1' 转为数字 1
        if (digit < 0 || digit > 9) throw new NumberFormatException();
        result = result * 10 + digit;
    }

    return negative ? -result : result;
}

📌 说明:

  • s.charAt(i) - '0':通过字符 ASCII 值转换成整数(比如 '3' 的 ASCII 是 51,'0' 是 48,51-48=3)
  • 字符逐个读取并计算:result = result * 10 + digit
  • 支持负数
  • 抛出异常:如果不是合法数字字符,就抛出 NumberFormatException

图片示例:对 "-1314" 进行 String 转换至 Integer


💡 四、装箱与缓存机制(valueOf 的核心区别)

java 复制代码
Integer.valueOf("123");

这个方法会先执行:

java 复制代码
int i = Integer.parseInt("123");

然后执行装箱:

java 复制代码
return Integer.valueOf(i);

🧠 Integer 缓存池机制:

Java 对于 [-128, 127] 之间的整数做了缓存,所以多次 valueOf(127) 实际上返回的是同一个对象。

java 复制代码
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println(a == b); // true

Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println(c == d); // false

✅ 面试陷阱点总结

考点 解答
parseIntvalueOf 的区别? 一个返回 int,一个返回 Integer,后者有装箱过程
哪个方法更推荐? valueOf 推荐用于对象封装,parseInt 更轻量用于原始类型
Integer.valueOf() 有缓存机制吗? ✅ 有,范围是 [-128, 127]
为什么 new Integer() 不推荐? 每次都会创建新对象,浪费内存,不走缓存池

📘 延伸知识

  • 反过来 Integer → String 怎么转?

    java 复制代码
    String s = String.valueOf(123);
    String s2 = Integer.toString(123);

🧩 Mermaid 图解:String 转 Integer 的常见方式及原理

String str = S\ Integer.parseInt(str) 返回 int 类型 内部逐字符计算
result = result * 10 + digit Integer.valueOf(str) 先调用 parseInt(str) 然后 Integer.valueOf(int) 触发装箱 & 缓存机制 返回 Integer 对象 new Integer(str) 调用构造函数 不使用缓存,每次都新建对象


📌 图解说明:

  • parseInt() 返回基本类型 int,适合纯粹数值计算。
  • valueOf() 是包装类推荐方式,支持缓存池([-128, 127])。
  • new Integer() 会创建新的对象,已被标记为不推荐(已废弃)。
相关推荐
TAEHENGV11 小时前
回收站模块 Cordova 与 OpenHarmony 混合开发实战
android·java·harmonyos
a努力。12 小时前
宇树Java面试被问:方法区、元空间的区别和演进
java·后端·面试·宇树科技
2501_9167665412 小时前
【面试题1】128陷阱、==和equals的区别
java·开发语言
码事漫谈12 小时前
二叉树中序遍历:递归与非递归实现详解
后端
码事漫谈12 小时前
跨越进程的对话之从管道到gRPC的通信技术演进
后端
a程序小傲13 小时前
蚂蚁Java面试被问:注解的工作原理及如何自定义注解
java·开发语言·python·面试
幽络源小助理13 小时前
SpringBoot+Vue摄影师分享社区源码 – Java项目免费下载 | 幽络源
java·vue.js·spring boot
0和1的舞者13 小时前
《软件测试分类指南:8 大维度 + 核心要点梳理》
java·软件测试·单元测试·测试·黑盒测试·白盒测试·测试分类
TAEHENGV13 小时前
创建目标模块 Cordova 与 OpenHarmony 混合开发实战
android·java·开发语言
无限大613 小时前
为什么"数据压缩"能减小文件大小?——从冗余数据到高效编码
后端