BigDecimal.valueOf缓存机制

4

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


这个链接对你有帮助吗? - Ankur Singhal
1
我在另一个主题中找到了正确的答案 正确答案 - dawis11
2个回答

8
看JDK 1.8源代码,它似乎只是一个静态数组,在类初始化时初始化——它仅缓存值为0到10(包括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
如果我没错的话,它只缓存了零、一、二和十,这就是为仅有的原因。
 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)方法。


1
关于BigDecimal和BigDecimal缓存从0到10,还有ZERO、ONE、TWO和TEN只是该类中的常量的问题。我不知道你为什么回答了BigInteger的问题。 - dawis11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接