🦊一句话总结
Integer.parseInt(s)
直接返回 int
原始类型,而 Integer.valueOf(s)
返回 Integer
对象(会利用缓存优化性能,-128~127 范围内对象复用)。
要
int
用parseInt
,要Integer
对象用valueOf
,高频操作用parseInt
避免装箱开销。
🎯总结
-
Integer.parseInt(s)
:直接返回int
,无缓存,适合需要原始类型的场景。 -
Integer.valueOf(s)
:返回Integer
,优先使用缓存,适合需要对象且值在 -128 ~ 127 的场景。 -
本质关系 :
valueOf
是parseInt
的"增强版",内部先调用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 可判 null ,int 无法判 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