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