哪个更好:让Java自动装箱还是使用valueOf()?

22

我只是想知道让Java自动装箱一个整数是否有区别:

Integer myInteger = 3; // This will call Integer.valueOf()

或者将您的代码

Integer myInteger = Integer.valueOf(3);

这个代码有没有可以优化的地方?我知道第二种写法更明确,但也意味着要多打一些字,除了这点之外还有什么区别吗?

3个回答

20

它们在内部无论如何都是相等的,因此请使用第一种变体。有可能,未来的编译器优化可能会使第一种变体更快。


2
很有可能,未来的编译器优化可能会使第一个更快。如果有任何内在的东西,它们都应该同时应用。 - bestsss
6
反例:他们可能决定为前5个数字定义常量,而目前他们使用一个数组来存储前127个实例。编译器可能会将前者转换为myInteger = Integer.THREE,而后者仍然是方法调用和数组访问。 - Daniel
1
不是JIT进行转换,而是javac!JIT执行其他好的事情。 - Daniel
1
bestsss:编译器将例如字符串连接转换为对StringBuilder的调用。这是因为在字节码指令中没有定义字符串连接。同样,在字节码指令中也没有定义自动装箱。这是编译器的工作,而不是运行时的工作。编译器会识别出需要自动装箱才能从源代码中得到一些可工作的字节码。编译器可以以任何方式进行操作,只要符合规范即可。完成后,字节码就不再需要知道是否使用了自动装箱或手动装箱并显式调用valueOf。 - Daniel
2
@bestsss,我不同意你的最后一句话。假设ab是字符串,String s = a + b;将被编译器转换为String s = new StringBuilder(a).append(b).toString();实际上,《Effective Java》的第51条建议正是因为这个原因而命名为“当心字符串连接的性能问题”...引用一句话,“道理很简单:除非性能无关紧要,否则不要使用字符串连接运算符来组合多个字符串。” - corsiKa
显示剩余7条评论

5
我会选择第一个选项。它与较少的代码完成了同样的事情。
除非我预计该程序必须在旧版本的JVM上运行。然而,在这种情况下,这远非是唯一的兼容性问题。
因此,不使用自动装箱的唯一原因是它不可用。

1
在旧版的JVM中根本没有自动装箱,所以这段代码将无法编译。从1.5开始,自动装箱变得可用后,这些变体是相同的。 - Daniel
@Daniel:是的,这是好的一面。你知道如果编译后它不能立即工作(或失败)。 - Goran Jovic

1
据我所知,在性能方面实际上并没有太大的差异,请参见此帖here 这种差异实际上并不是差异,但你应该使用valueOf,因为Integer现在会缓存-128到127之间的整数对象。

为什么只适用于服务器端操作?在客户端上同样具有高性能。 - Daniel
我只是猜想他/她正在进行服务器端开发(网站或Web应用程序),Java在这方面被广泛使用 :) - 7dr3am7
已修复 :) 希望您满意。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接