1

有什么区别,

Integer i = new Integer("42");

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

谢谢。

4

3 回答 3

4

没有,看一下 Integer.java:

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

此外,JavaDoc

于 2009-11-25T20:57:01.433 回答
2

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

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

我听说一些实现缓存了前 100 个左右的整数,因为它们出现的频率足够高,因此可以得到回报。

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

于 2009-11-25T21:11:11.607 回答
1

查看源代码,我们可以看出没有区别。

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

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

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

结果 Integer 在这两种情况下的行为完全相同

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

public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return valueOf( parseInt( s, radix ));// which uses the cache
 }

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

于 2009-11-25T21:06:39.977 回答