Integer.parseInt() 与 Integer.valueOf() 的区别

在做 Sonar 代码扫描时,Sonar 提示将代码中的 Integer.valueOf 改成 Integer.parseInt,其实Integer.parseIntInteger.valueOf这两个方法都可以将 String 转成int,那么它们的区别是什么呢?

单从方法定义上看,不同的是 parseInt 返回的是 intvalueOf 返回的是Integer

1
2
3
4
5
6
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}

它们都会调用 parseInt(s,10) 方法,该方法第二个参数代表进制。valueOf方法还会在转好的 int 基本类型的基础上转成 Integer 对象类型,调用 Integer.valueOf(i) 方法:

1
2
3
4
5
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

这里要注意,对于 -128~127 之间的值,该方法会返回缓存的对象,所以两者之间是可以用 == 比较的。

1
2
3
4
5
6
7
8
9
10
11
12
int i = Integer.parseInt("100");
int j = Integer.parseInt("100");
System.out.println(i == j); // true

Integer m = Integer.valueOf("100");
Integer n = Integer.valueOf("100");
System.out.println(m == n); // true

Integer p = Integer.valueOf("200");
Integer q = Integer.valueOf("200");
System.out.println(p == q); // false
System.out.println(p.equals(q)); // true

总结:

大部分情况下,如果只是将 String 转成整形数值,做一些运算的话,使用 Integer.parseInt 就可以了。