用数组拷贝实现自定义栈的核心是通过system.arraycopy或arrays.copyof创建新数组来模拟动态扩容与缩容,避免使用arraylist或stack,以贴近底层原理;栈用泛型类arraystack封装,内部维护elements数组和size索引,push时容量满则翻倍拷贝,pop后元素数≤1/4容量且容量大于默认值时减半拷贝前size个元素,泛型数组创建需强制转换并抑制警告。

用数组拷贝实现自定义栈,核心是用固定大小的数组存储元素,并在每次入栈、出栈时通过 System.arraycopy 或 Arrays.copyOf 创建新数组来模拟动态扩容与缩容。这种方式避免了直接使用 ArrayList 或 Stack,更贴近底层原理理解。
栈的基本结构与初始化
定义一个泛型类 ArrayStack<e></e>,内部维护一个对象数组 elements 和当前栈顶索引 size(指向下一个可插入位置)。初始容量设为默认值(如 4),数组在构造时创建:
- size = 0 表示栈为空,size == elements.length 表示已满
- 不直接修改原数组长度,所有“改变容量”的操作都通过拷贝生成新数组完成
push 操作:扩容拷贝
入栈前检查是否已满。若满,则创建容量翻倍的新数组,把原数组全部元素拷贝过去,再添加新元素:
- 调用
Arrays.copyOf(elements, elements.length * 2)最简洁 - 等价写法:
Object[] newArr = new Object[oldLen * 2]; System.arraycopy(oldArr, 0, newArr, 0, oldLen); - 拷贝后更新
elements引用,并将新元素放入elements[size++]
pop 操作:缩容拷贝(可选但推荐)
出栈后若元素数量降至容量的 1/4 且容量大于默认值,可缩容以节省内存:
- 仅当
size > 0 && size == elements.length / 4 && elements.length > DEFAULT_CAPACITY时触发 - 新建长度减半的数组,用
Arrays.copyOf(elements, elements.length / 2)拷贝前size个元素 - 注意:拷贝的是
size个有效元素,不是整个旧数组
其他细节与注意事项
peek、isEmpty、size 等方法无需拷贝,直接访问 elements 和 size 即可。关键点在于:
- 所有数组变更必须通过拷贝实现,原数组始终不可变长或变短
- 拷贝范围要精确——push 拷全量,pop 缩容时只拷
size个元素 - 泛型数组创建需绕过类型擦除:用
(E[]) new Object[capacity],并加@SuppressWarnings("unchecked")











