为什么Javadoc的Double.valueof表示不缓存值?


问题内容

在OpenJDK中,该方法为:

public static Double valueOf(double d)

Javadoc说:

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

这是实际的代码:

public static Double valueOf(double d) {
    return new Double(d);
}

缓存是骗人的!这里发生了什么?


问题答案:

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

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

Java的更高版本 可能 将此行为扩展到其他值/更多类型。因此,今天使用此代码很明智,因为这可能会使您的代码明天更快(并且今天的代码不会太慢)。

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