使用new运算符包装原语使用valueOf包装原语

时间:2009-11-25 20:55:01

标签: java wrapper

有什么区别,

Integer i = new Integer("42");

Integer i = Integer.valueOf("42");

感谢。

3 个答案:

答案 0 :(得分:4)

没有,看看Integer.java:

public static Integer valueOf(String s) throws NumberFormatException {
    return new Integer(parseInt(s, 10));
}

此外,JavaDoc

答案 1 :(得分:2)

使用new非常明确地要求为每次出现创建一个新对象。

使用工厂模式(valueOf)为实现提供了一个机会(它不需要接受),而是从缓存中提供已经创建的实例。

我听说有一些实现缓存前100个左右的整数,因为它们经常发生,足以让它得到回报。

最有用的情况是使用Boolean。我们知道只有两个可能的不同值,因此valueOf总是返回这两个中的一个,而没有创建新对象的开销。将new与布尔值一起使用是合法的,但总会在性能和内存使用方面产生开销。

答案 2 :(得分:1)

查看我们可以告诉的源代码没有区别。

前者使用构造函数显式创建一个新整数。

后者使用工厂方法创建一个整数(结果是调用构造函数)。

第二个调用第一个的事实是实现细节,并且在所有实现中都不一定正确,在某些情况下它可能不会调用构造函数但使用缓存(如{{1 }})

在两种情况下,生成的Integer的行为完全相同。

然而,没有什么可以阻止将第二个改为:

valueOf( int i )

这个更改可以在下一个版本中执行(或者某些VM可以这样做)并且您的代码将在升级中“自动”获取,而另一方面,使用构造函数则不能,因为好吧,你是显式调用构造函数。