在OpenJDK中,对于方法:
public static Double valueOf(double d)
javadoc说:
返回表示指定Double值的double实例。如果不需要新的Double实例,通常应该优先使用此方法而不是构造函数Double(double),因为此方法通过缓存频繁请求的值可能会产生明显更好的空间和时间性能。
下面是实际的代码:
public static Double valueOf(double d) {
return new Double(d);
}
缓存是个谎言!这里发生了什么事?
发布于 2011-12-19 21:07:56
该方法存在于多种类型:Integer
、Long
、BigDecimal
和其他类型,并且文档总是相同的:在某些情况下(未定义),该方法可以返回相同的结果。
AFAIK中,缓存只为整数类型实现,它返回-128到127 (最常见的值)之间的值的缓存实例。对于BigDecimal
,缓存当前适用于0到10之间的值。
Java的后续版本可能会将此行为扩展到其他值/更多类型。所以今天使用这段代码是明智的,因为它可能会让你的代码明天变得更快(并且今天的代码不会变慢)。
例如,Java编译器在生成用于自动装箱的代码时使用此API。
发布于 2011-12-19 21:07:51
API文档没有问题:
此方法可能会产生...
也就是说,允许实现在这里进行缓存,这对于构造函数来说是不可能的。但是,这并不是必需的。但是,由于您有一个执行缓存的实现,因此这种方法应该比使用构造函数更可取。
发布于 2011-12-19 21:09:37
在Java中,1.5+ /JIT保证了Integer
s -127到127的缓存。这就是为什么对于Integer
,首选的方法是使用valueOf
。您通常应该使用valueOf
而不是使用double
的构造函数,因为这样JIT就能够在它认为合适的时候优化您的代码。例如,考虑以下循环:
for (Object o: objectList) {
o.setValue(Double.valueOf(0.0));
}
在这种情况下,JIT可以预先计算double对象,并在循环的每次迭代中重新分配相同的值,而如果您使用new Double(0.0);
,它将无法做到这一点。
https://stackoverflow.com/questions/8561710
复制相似问题