首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Double.valueof javadoc说它缓存值,而它没有呢?

为什么Double.valueof javadoc说它缓存值,而它没有呢?
EN

Stack Overflow用户
提问于 2011-12-19 20:59:11
回答 6查看 3.2K关注 0票数 54

在OpenJDK中,对于方法:

代码语言:javascript
复制
public static Double valueOf(double d)

javadoc说:

返回表示指定Double值的double实例。如果不需要新的Double实例,通常应该优先使用此方法而不是构造函数Double(double),因为此方法通过缓存频繁请求的值可能会产生明显更好的空间和时间性能。

下面是实际的代码:

代码语言:javascript
复制
public static Double valueOf(double d) {
    return new Double(d);
}

缓存是个谎言!这里发生了什么事?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-12-19 21:07:56

该方法存在于多种类型:IntegerLongBigDecimal和其他类型,并且文档总是相同的:在某些情况下(未定义),该方法可以返回相同的结果。

AFAIK中,缓存只为整数类型实现,它返回-128到127 (最常见的值)之间的值的缓存实例。对于BigDecimal,缓存当前适用于0到10之间的值。

Java的后续版本可能会将此行为扩展到其他值/更多类型。所以今天使用这段代码是明智的,因为它可能会让你的代码明天变得更快(并且今天的代码不会变慢)。

例如,Java编译器在生成用于自动装箱的代码时使用此API。

票数 57
EN

Stack Overflow用户

发布于 2011-12-19 21:07:51

API文档没有问题:

此方法可能会产生...

也就是说,允许实现在这里进行缓存,这对于构造函数来说是不可能的。但是,这并不是必需的。但是,由于您有一个执行缓存的实现,因此这种方法应该比使用构造函数更可取。

票数 29
EN

Stack Overflow用户

发布于 2011-12-19 21:09:37

在Java中,1.5+ /JIT保证了Integers -127到127的缓存。这就是为什么对于Integer,首选的方法是使用valueOf。您通常应该使用valueOf而不是使用double的构造函数,因为这样JIT就能够在它认为合适的时候优化您的代码。例如,考虑以下循环:

代码语言:javascript
复制
for (Object o: objectList) {
  o.setValue(Double.valueOf(0.0));
}

在这种情况下,JIT可以预先计算double对象,并在循环的每次迭代中重新分配相同的值,而如果您使用new Double(0.0);,它将无法做到这一点。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8561710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档