我目前正在检查Stack<E>
类,看看它是否已满。但是,List没有isFull()
实现,所以我要求检查capacity()
是否与size()
相同。根据文档,size()
返回此向量中的分量数,容量返回向量的当前容量。如果我理解正确,它们是一样的吗?如果是这样,我该如何检查我的Stack<E>
是否已满?
Java 中的Stack
数据结构表示一个后进先出 (LIFO) 对象堆栈。它通过五个操作扩展了类Vector
,例如
- 推
- 流行
- 堆栈顶部的速览项
- 检查堆栈是否为空,并且
- 在堆栈中搜索项目
当堆栈类如下所示时
public class Stack extends Vector {
}
创建堆栈时,它不包含任何项目。即将确定堆叠容量和大小
Size
- 当前堆栈包含的元素数
Capacity
- 它能够容纳的元素数量
Push
操作实现如下
public E push(E item) {
addElement(item);
return item;
}
addElement
方法属于Vector
类,它有助于将新元素插入Vector
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
ensureCapacityHelper
允许检查内部Vector
是否能够添加新元素。如果它没有足够的空间来容纳新元素,则Vector
会增长
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
Arrays.copyOf
是一种本机方法,将使用newCapacity
分配新的内存空间,并将数据从旧内存位置复制到新位置。
stack.size()
- 给出当前大小,即推送到堆栈的元素总数
stack.capacity()
- 给出当前容量,即数组大小,如 10 或 20 等......即,一旦您将 10 个元素推送到堆栈,您的堆栈容量就会翻倍。
内部Stack
使用Vector
Vector
是一个动态增长的阵列。 另外,对于Stack
,您不能手动设置capacityIncrement
因子,而是堆栈本身在内部管理,您可以在此处查看
size
是堆栈中当前元素的数量。
capacity
是一个内部细节,告诉您适合Vector
的最大项目数。 但是,这并不真正相关,因为当达到容量时,它会自动扩展。