不如你直接看ArrayList的源码
我看ArrayList对于扩容是直接进行了Arrays.copyOf复制,在扩容长度上讲究了一下
Java应该也有将整个数组赋值到新的数组中的方法,可以找找
你说的是,Arrays.copyOf这种直接赋值的方法吗
我觉得可以,不过扩容的时候最好别一个一个扩,一次扩容多加一些预留位置,可以减少扩容次数
是不是每次扩容的容量大点?我设置新数组是原数组的俩倍,应该还行吧
@长安不乱: 应该可以,另外如果出栈的元素太多了,可能还要考虑减小数组的长度呢
我觉得如果用列表实现,比数组简单,不用考虑扩容什么的,比如有一个链表a->b->c,如果push了一个d,就改成d->a->b->c,pop后再变成a->b->c这样是不是简单一点
@会长: 只要是被指定了,是我的一道面试题,指定就用数组来实现栈,当时就问的这个扩容问题。
@会长: 这个减少数组的长度确实也可以加上
@长安不乱: 我觉得可以这样,最开始设置一个初始长度,比如50或者100,快满的时候增加一倍,当元素数量减少到不到一半时,减半
我没记错的话,map就能实现自动扩容功能。可以看看map源码list好像也能自动扩容。扩容的操作方式就是先判断,然后复制。
嗯嗯。我看ArrayList里面的源码也是这样操作的
确定下自己的扩容因子,思路没问题。
你直接看SDK的stack实现最靠谱,
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Stack.java
http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/util/Vector.java
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);
}