Integer.valueOf() 是 Java 中用于将字符串或基本整型数值转换为 Integer 对象的核心方法之一。它在自动装箱、字符串解析和性能优化中扮演重要角色。


一、方法定义

Integer.valueOf() 提供了多个重载版本:

// 1. 将字符串解析为 Integer 对象
public static Integer valueOf(String s) throws NumberFormatException

// 2. 将字符串按指定进制解析为 Integer 对象
public static Integer valueOf(String s, int radix) throws NumberFormatException

// 3. 将 int 基本类型装箱为 Integer 对象
public static Integer valueOf(int i)

说明

  • 所有方法均为 static,直接通过类名调用。
  • 返回值是 java.lang.Integer 类型(包装类)。

二、功能说明

方法签名 功能
valueOf(String s) 将十进制字符串转换为对应的 Integer 对象。
valueOf(String s, int radix) 按指定进制(如 2、8、16)将字符串解析为 Integer
valueOf(int i) int 基本类型“装箱”成 Integer 对象。

三、示例代码

示例 1:字符串转 Integer(十进制)

String str = "123";
Integer num = Integer.valueOf(str);
System.out.println(num); // 输出:123

示例 2:按进制解析字符串

String hex = "FF";
Integer numHex = Integer.valueOf(hex, 16); // 十六进制
System.out.println(numHex); // 输出:255

String binary = "1101";
Integer numBin = Integer.valueOf(binary, 2); // 二进制
System.out.println(numBin); // 输出:13

示例 3:int 装箱为 Integer

int primitive = 42;
Integer boxed = Integer.valueOf(primitive);
System.out.println(boxed); // 输出:42

四、使用技巧

1. 缓存机制利用(性能关键)

Integer.valueOf(int) 对于 -128 到 127 范围内的值会复用缓存对象,避免重复创建。

Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b); // true(引用相同,因缓存)

Integer c = Integer.valueOf(200);
Integer d = Integer.valueOf(200);
System.out.println(c == d); // false(超出缓存范围,新对象)

建议:频繁使用小整数时优先使用 valueOf 而非 new Integer()

2. 替代 new Integer()

❌ 避免使用已废弃的构造函数:

// 不推荐(已弃用)
Integer bad = new Integer("123");

✅ 推荐使用:

Integer good = Integer.valueOf("123");

3. 与 parseInt 结合使用场景

  • Integer.parseInt() 返回 int(基本类型)
  • Integer.valueOf() 返回 Integer(对象)
int primitive = Integer.parseInt("123");     // 获取基本类型
Integer object  = Integer.valueOf("123");    // 获取包装对象

五、常见错误

1. NumberFormatException

当字符串格式非法时抛出异常。

Integer.valueOf("abc");      // 抛出 NumberFormatException
Integer.valueOf("");         // 抛出 NumberFormatException
Integer.valueOf(null);       // 抛出 NullPointerException
Integer.valueOf("12.34");    // 抛出 NumberFormatException

解决方案:添加异常处理。

try {
    Integer num = Integer.valueOf("abc");
} catch (NumberFormatException e) {
    System.err.println("字符串格式错误:" + e.getMessage());
}

2. 忽略进制参数导致误解析

Integer.valueOf("10", 2); // 解析为二进制 -> 2
Integer.valueOf("10");    // 默认十进制 -> 10

⚠️ 注意:传入的字符串必须符合对应进制规则。


六、注意事项

项目 说明
null 输入 Integer.valueOf(null) 会抛出 NullPointerException
空字符串 "" 无法解析,抛出 NumberFormatException
前导/后缀空格 " 123 " 会被自动忽略空格(Java 7+),但建议提前 trim
最大最小值 超出 Integer.MIN_VALUE (-231) 到 Integer.MAX_VALUE (231-1) 会抛异常
进制范围 radix 必须在 2~36 之间,否则抛出 NumberFormatException

七、最佳实践

✅ 推荐做法

  1. 优先使用 Integer.valueOf(int) 进行装箱

    Integer num = Integer.valueOf(50); // ✅ 利用缓存
    
  2. 字符串转整数优先使用 valueOf

    Integer num = Integer.valueOf(str); // 返回 Integer 对象
    
  3. 对输入做预校验

    if (str != null && !str.trim().isEmpty()) {
        try {
            Integer value = Integer.valueOf(str.trim());
        } catch (NumberFormatException e) { /* 处理异常 */ }
    }
    
  4. 明确指定进制避免歧义

    Integer.valueOf("1010", 2); // 明确是二进制
    

八、性能优化

1. 利用缓存减少对象创建

  • -128 ~ 127Integer 对象被 JVM 缓存。
  • 使用 valueOf() 可复用对象,减少 GC 压力。
// 高频小整数场景下性能更优
for (int i = 0; i < 1000; i++) {
    Integer num = Integer.valueOf(50); // 复用同一对象
}

2. 避免不必要的自动装箱

在循环或高性能场景中,尽量使用 int 而非 Integer

// ❌ 性能差
Integer sum = 0;
for (Integer i = 0; i < 1000; i++) {
    sum += i;
}

// ✅ 推荐
int sum = 0;
for (int i = 0; i < 1000; i++) {
    sum += i;
}

3. 批量解析优化建议

若需大量解析字符串,可考虑:

  • 使用 parseInt() + 手动缓存常用值
  • 或使用第三方库(如 FastUtil)

九、总结

重点 内容
核心用途 字符串解析、基本类型装箱
优势 支持缓存、比构造函数高效、支持多进制
推荐替代 替代 new Integer(...) 和部分 parseInt() 场景
异常处理 必须处理 NumberFormatExceptionNullPointerException
性能要点 小整数缓存 (-128~127) 提升性能,避免频繁装箱
最佳实践 输入校验 + 异常捕获 + 明确进制 + 优先使用 valueOf

💡 一句话总结Integer.valueOf() 是 Java 中安全、高效地创建 Integer 对象的首选方式,兼具字符串解析与自动装箱能力,合理使用可显著提升程序性能与健壮性。


快速掌握口诀

小整数用 valueOf,
字符串转整别忘 try-catch,
-128~127 有缓存,
new Integer 已淘汰!