BigDecimal.valueOf缓存机制

时间:2015-01-05 08:43:46

标签: java caching bigdecimal

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

2 个答案:

答案 0 :(得分:6)

看看JDK 1.8源代码,看起来它只是一个静态数组,它被初始化为类初始化的一部分 - 它只缓存0到10的值,但这是一个实现细节。例如,给定dasblinkenlight的帖子,看起来早期版本只缓存0和1。

有关更多详细信息 - 并确保您获得有关实际运行的JDK的信息 - 请查看您自己使用的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的计算机上,输出为:

  

11的值未缓存

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

答案 1 :(得分:0)

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

 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)方法。