gpt4 book ai didi

java - 为什么 Joshua Bloch 在 Effective Java 中使用 2*size + 1 来调整堆栈大小?

转载 作者:行者123 更新时间:2023-12-03 10:03:49 25 4
gpt4 key购买 nike

这是我正在谈论的代码:

public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
/**
* Ensure space for at least one more element, roughly
* doubling the capacity each time the array needs to grow.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
为什么不简单地将最后一行保留为 elements = Arrays.copyOf(elements, 2 * size); ?
它可能有效的唯一情况是 Stack 的初始大小为 0。但在这种情况下,它是一个常量 - DEFAULT_INITIAL_CAPACITY(非零值)。并且没有其他重载构造函数可以从用户那里获取这个值(或默认为 0)

最佳答案

我将其解释为对假设的 future 错误的安心防御。确实,正如所写的那样,这个类的数组容量不会为 0,因此添加 1 并不是绝对必要的,但是一旦添加更多功能,这种假设可能会悄悄地失败。
可能的附加功能示例包括来自 java.util.ArrayList 的功能。 ,其中有一个 trimToSize()可以将容量设置为 0 的方法,以及一个允许从(可能为空)集合初始化数据的构造函数,以及一个允许将容量显式设置为 0 的构造函数。您还可以想象一个自动减少此类分配容量的功能当它被清空时。或者也许有人会编辑 DEFAULT_INITIAL_CAPACITY常数。现在想象一下,容量改变的方法被一整屏的 javadoc 注释分隔开,并拆分到子类中。很容易忘记您应该防止容量变为 0。
ensureCapacity()取决于大小不为零,因此在重新编写类时必须始终牢记该假设。添加 +1是一种消除这种担忧的低成本改变。这也是处理边缘情况的简单算术方法的一个例子。

关于java - 为什么 Joshua Bloch 在 Effective Java 中使用 2*size + 1 来调整堆栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64394410/

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