Hüs*_*lik 3 java caching bigdecimal
我听说这个BigDecimal.valueOf()方法比调用好,new BigDecimal()因为它缓存了常见的值.我想知道缓存机制是如何valueOf工作的.
看看JDK 1.8源代码,看起来它只是一个静态数组,它被初始化为类初始化的一部分 - 它只缓存值0到10(包括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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的Java 8机器上,输出是:
11的值未缓存
当然,实现总是可以缓存最近请求的值,在这种情况下,上面的代码将运行很长时间,然后完成没有输出...
| 归档时间: |
|
| 查看次数: |
930 次 |
| 最近记录: |