在Java中,Integer.parseInt和Integer.valueOf有什么区别

🦊一句话总结

Integer.parseInt(s) 直接返回 int 原始类型,而 Integer.valueOf(s) 返回 Integer 对象(会利用缓存优化性能,-128~127 范围内对象复用)。

intparseInt,要 Integer 对象用 valueOf,高频操作用 parseInt 避免装箱开销。

🎯总结

  • Integer.parseInt(s) :直接返回 int,无缓存,适合需要原始类型的场景。

  • Integer.valueOf(s) :返回 Integer优先使用缓存,适合需要对象且值在 -128 ~ 127 的场景。

  • 本质关系valueOfparseInt 的"增强版",内部先调用 parseInt,再自动装箱。

方法 返回类型 是否使用缓存 底层实现 适用场景
Integer.parseInt(s) int ❌ 不适用 直接计算字符串数值 需要原始类型 int 的场景
Integer.valueOf(s) Integer ✅ 使用缓存 内部调用 parseInt(s) + 自动装箱 需要 Integer 对象的场景

代码示例

(1)Integer.parseInt(s)

java 复制代码
String s = "127";
int a = Integer.parseInt(s);        // 返回 int(原始类型)
Integer b = Integer.parseInt(s);    // 自动装箱(等价于 Integer.valueOf(127))

System.out.println(a); // 127(int)
System.out.println(b); // 127(Integer,但会使用缓存)
  • 特点
    • 返回 int,无缓存概念。
    • 若需 Integer,需额外装箱(JVM 可能优化为 valueOf)。

(2)Integer.valueOf(s)

java 复制代码
String s = "127";
Integer c = Integer.valueOf(s);     // 返回 Integer(可能来自缓存)
Integer d = Integer.valueOf("200"); // 返回新 Integer 对象(超出缓存范围)

System.out.println(c == Integer.valueOf(127)); // true(同一缓存对象)
System.out.println(d == Integer.valueOf(200)); // false(不同对象)
  • 特点
    • 返回 Integer优先使用缓存(-128 ~ 127)
    • 内部实现:先 parseInt(s),再 Integer.valueOf(int)

底层实现源码

(1)Integer.parseInt(s)

java 复制代码
public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s, 10); // 默认十进制
}

public static int parseInt(String s, int radix) {
    // 逐字符解析,计算数值...
    // 无缓存,直接返回 int
}

(2)Integer.valueOf(s)

java 复制代码
public static Integer valueOf(String s) throws NumberFormatException {
    return Integer.valueOf(parseInt(s)); // 先解析为 int,再装箱(可能缓存)
}

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high) {
        return IntegerCache.cache[i + (-IntegerCache.low)]; // 缓存
    }
    return new Integer(i); // 新建对象
}

性能对比

场景 推荐方法 原因
需要 int 原始类型 Integer.parseInt(s) 避免自动装箱开销(直接返回 int
需要 Integer 对象 Integer.valueOf(s) 利用缓存(-128 ~ 127),减少对象创建
高频调用(如循环内) Integer.parseInt(s) 避免装箱/拆箱(若业务允许用 int
处理用户输入/配置文件 Integer.valueOf(s) 更安全(返回 Integer 可判 nullint 无法判 null

🐼特殊场景

1、字符串含非数字字符

java 复制代码
String s = "123abc";
Integer.parseInt(s); // 抛出 NumberFormatException
Integer.valueOf(s);  // 同样抛出 NumberFormatException
  • 两者行为一致,均严格校验字符串。

2、空字符串或 null

java 复制代码
Integer.parseInt("");   // 抛出 NumberFormatException
Integer.valueOf(null);  // 抛出 NullPointerException

3、十六进制/八进制

java 复制代码
int hex = Integer.parseInt("FF", 16); // 255
int octal = Integer.parseInt("17", 8); // 15
// valueOf 不支持进制参数,需用 parseInt + valueOf
Integer i = Integer.valueOf(Integer.parseInt("FF", 16)); // 255
相关推荐
✎ ﹏梦醒͜ღ҉繁华落℘16 分钟前
菜鸟的算法基础
java·数据结构·算法
老华带你飞24 分钟前
社团管理|基于Java社团管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
shayudiandian33 分钟前
用LangChain打造你自己的智能问答系统
java·数据库·langchain
kingmax542120081 小时前
高中数学试讲稿:《对数与指数之间的相互转化》
面试·教师资格
invicinble1 小时前
spring相关系统性理解,企业级应用
java·spring·mybatis
over6971 小时前
深入解析:基于 Vue 3 与 DeepSeek API 构建流式大模型聊天应用的完整实现
前端·javascript·面试
jiayong231 小时前
Spring IOC 与 AOP 核心原理深度解析
java·spring·log4j
卿雪2 小时前
Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
java·数据库·redis·sql·mysql·缓存·golang
lkbhua莱克瓦242 小时前
IO流练习(修改文件中的数据)
java·windows·学习方法·io流·java练习题·io流练习
老华带你飞2 小时前
汽车销售|汽车报价|基于Java汽车销售系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·汽车