自动拳击与静态数字

时间:2011-08-01 09:13:08

标签: java performance coding-style boxing

使用Integer i = NumberUtils.INTEGER_ONE代替Integer i = 1是否有价值?我不知道自动拳击背后会发生什么。

由于

2 个答案:

答案 0 :(得分:9)

基本上它将编译成:

Integer i = Integer.valueOf(NumberUtils.INTEGER_ONE);

假设INTEGER_ONE被声明为int

在执行时,假设INTEGER_ONE的值为1,实际上每次都会返回对同一对象的引用,由Java语言规范保证,因为它在-128到127的范围内。范围之外的值可以返回对同一对象的引用,但不必返回。

答案 1 :(得分:0)

java中的许多包装器和实用程序类都有缓存池。当调用valueOf()方法时,Integer使用内部缓存的静态数组'Integer'引用。字符串也有类似的池。

但是,如果你执行类似Integer i = 128的操作,那么这将开始影响性能,因为自动装箱将为未缓存的整数启动(不是说它不会为缓存的整数启动)。与返回缓存整数的情况不同,此语句创建一个新对象。对象创建很昂贵并且会降低性能。

[编辑]

澄清答案