BigDecimal.valueOf缓存机制

BigDecimal.valueOf caching mechanism

我听说 BigDecimal.valueOf() 方法比调用 new BigDecimal() 方法更好,因为它缓存了公共值。我想知道 valueOf 的缓存机制是如何工作的。

查看 JDK 1.8 源代码,它看起来只是一个静态数组,作为 class 初始化的一部分进行初始化 - 它只缓存 0 到 10 之间的值,但这是一个实施细节。例如,给定 dasblinkenlight 的 post,看起来早期版本只缓存了 0 和 1。

有关更多详细信息 - 并确保您获得有关 JDK 的信息,您实际上 运行ning - 查看 JDK 您的来源自己使用 - 大多数 IDE 会自动打开相关的源代码,如果它们检测到源存档已包含在您的 JDK 安装中。当然,如果您在执行时使用不同的 JRE,您也需要对其进行验证。

根据引用相等很容易判断一个值是否被缓存。这是一个简短但完整的程序,它找到 没有 缓存的第一个非负值:

import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {
        for (long x = 0; x < Long.MAX_VALUE; x++) {
            if (BigDecimal.valueOf(x) != BigDecimal.valueOf(x)) {
                System.out.println("Value for " + x + " wasn't cached");
                break;
            }
        }
    }
}

在我的机器上 Java 8,输出是:

Value for 11 wasn't cached

当然,一个实现 可以 总是缓存最近请求的值,在这种情况下,上面的代码会 运行 很长时间然后完成没有输出...

如果我没记错的话它只缓存零、一、二和十,这就是为什么我们只有

 public static final BigInteger ZERO = new BigInteger(new int[0], 0);
 public static final BigInteger ONE = valueOf(1);
 private static final BigInteger TWO = valueOf(2);
 public static final BigInteger TEN = valueOf(10);

这也调用了 valueOf(x) 方法。