我听说BigDecimal.valueOf()
方法比调用new BigDecimal()
更好,因为它会缓存常见值。我想知道valueOf
的缓存机制是如何工作的。
答案 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)方法。