由拆装箱引起的性能问题 | 张扎瓦的博客

由拆装箱引起的性能问题

Integer.valueOf与Integer.parseInt引发的性能问题


问题代码

1
int a = Integer.valueOf(request.getParameter("baseProjectId"))

这段代码看上去没什么问题,但其实会有性能上的浪费,Integer.valueOf()的部分源码:

1
2
3
4
5
6
7
8
9
10
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10)); // 注意parseInt这句
}

public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

由代码可以看出,Integer.valueOf() 先调用parseInt()解析字符串,然后再调用方法,将int转换为Integer对象,然后返回Integer对象。结合上面的问题代码,整个类型转换流程为:

1
String --> int --> Integer --> int

在此过程中,不仅创建了一个临时对象,浪费内存,而且进行了一次拆装箱操作,浪费了性能。

更改建议

直接将Integer.valueOf()改为Integer.parseInt()

1
int a = Integer.parseInt(request.getParameter("baseProjectId"))
如果我的文章对您有所帮助,不妨打赏一杯豆浆以资鼓励(○` 3′○)