gpt4 book ai didi

java - 为什么他们甚至在被要求之前就持有这么多实例(33)?他们从哪里得到数字 16?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:47:39 25 4
gpt4 key购买 nike

当我在研究静态 block 时,我想看看它在 java 源代码中的用法。所以我提到了 java.math.BigInteger.java 。那里的静态 block 是这样的

/**
* Initialize static constant array when class is loaded.
*/
private final static int MAX_CONSTANT = 16;
private static BigInteger posConst[] = new BigInteger[MAX_CONSTANT+1];
private static BigInteger negConst[] = new BigInteger[MAX_CONSTANT+1];
static {
for (int i = 1; i <= MAX_CONSTANT; i++) {
int[] magnitude = new int[1];
magnitude[0] = i;
posConst[i] = new BigInteger(magnitude, 1);
negConst[i] = new BigInteger(magnitude, -1);
}
}

static block code in code browser

由此我感觉到他们正在创建 33 个 BigInteger 实例并将其保存在 posConst 和 negConst 中。然后当人们在 BigInteger.java:valueOf 中调用 valueOf 时

如果值在 -16 到 16 之间,他们从 posConst 和 negConst 中获取并给出 .如果超出此范围,他们将创建新实例。

我可以理解,如果用户询问该列表中的一个,他们会持有实例以便随时提供。他们持有 33 个实例的依据或概率是多少。岂不是浪费内存。为什么不在用户询问时只创建那个特定实例。

我无法理解在这种逻辑中取得的权衡。请帮忙 。我在理解这段代码时出错了吗?如果是这样,请帮助。

最佳答案

这实际上是为了节省内存(以及创建对象所花费的时间)。使用 BigIntegers 的程序可能有相同数字的许多副本,通过仅存储 BigInteger(1) 的一个实例,您可以拥有数十万个对该数字的引用,但只需创建一个对象。

值得注意的是,静态初始化发生在引用类时,因此不使用 BigInteger 的程序不会存储此数组。在确实使用 BigInteger 的程序中,最坏的情况是您存储了 33 个不必要的对象,但在最好的情况下,您只需引用这些常量就可以节省数千个对象的创建和存储。

这叫做 Flyweight Pattern .

现在,为什么要存储这些特定常量,而不是程序中使用的确切对象?后者需要将程序中使用的每个 BigInteger 存储在哈希表中,并在每次创建新的 BigInteger 时检查该表,这在内存和计算时间方面比现有解决方案要昂贵得多。您还必须担心表的并发修改,因此也会涉及锁定。简而言之,内存程序中使用的确切对象的成本太高,无法默认完成。一些在 -16 到 16 范围之外重复使用大量 BigIntegers 的程序将自己实现这一点。

小数字通常在程序中出现的频率更高,这就是选择这些特定值进行内存的原因。

关于java - 为什么他们甚至在被要求之前就持有这么多实例(33)?他们从哪里得到数字 16?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20024705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com