有什么区别,
Integer i = new Integer("42");
和
Integer i = Integer.valueOf("42");
谢谢。
没有,看一下 Integer.java:
public static Integer valueOf(String s) throws NumberFormatException {
return new Integer(parseInt(s, 10));
}
此外,JavaDoc
非常明确地使用new
需要为每次出现创建一个新对象。
使用工厂模式 ( valueOf
) 为实现提供了一个机会(它不需要接受)来提供一个已经从缓存中创建的实例。
我听说一些实现缓存了前 100 个左右的整数,因为它们出现的频率足够高,因此可以得到回报。
最有用的情况是Boolean
. 我们知道只有两个可能的不同值,所以valueOf
总是返回这两个中的一个,而不会产生创建新对象的开销。使用new
布尔值是合法的,但总是会在性能和内存使用方面产生开销。
查看源代码,我们可以看出没有区别。
前者使用构造函数显式创建一个新整数。
后者使用工厂方法(结果调用构造函数)创建一个整数。
第二个调用第一个的事实是一个实现细节,不一定在所有实现中都是正确的,在某些情况下它可能不会调用构造函数而是使用缓存(如中valueOf( int i )
)
结果 Integer 在这两种情况下的行为完全相同。
然而,没有什么能阻止将第二个更改为:
public static Integer valueOf(String s, int radix) throws NumberFormatException {
return valueOf( parseInt( s, radix ));// which uses the cache
}
可以在下一个版本中执行该更改(或者某些 VM 可能会这样做),并且您的代码将在升级中“自动”获取它,而另一方面,使用您无法使用的构造函数,因为好吧,您'显式调用构造函数。