
本文详解java中手动实现动态数组扩容的核心要点,包括扩容逻辑、长度更新、遍历打印等常见错误及修正方案,并提供可直接运行的完整示例代码。
在Java中,原生数组(如 int[])是固定长度的,无法直接“改变大小”。但我们可以模拟动态数组行为——当容量不足时,创建一个更大的新数组,将原数组元素复制过去,并更新引用。这正是 ArrayList 等集合类底层扩容机制的核心思想。
然而,实现过程中极易出现几个关键疏漏,正如示例代码所示:
❌ 常见错误分析
未同步更新 size 字段
resize() 方法中创建了 new int[size * 2],但扩容后未更新 size 的值。导致后续调用 isFull() 仍基于旧容量判断(例如始终按 5 判断),而 array.length 已变为 10 —— 此时 pointer == array.length 成立,但 pointer == size 不成立,逻辑错位。-
size 字段冗余且易引发不一致
array.length 已精确反映当前底层数组容量,单独维护 size 不仅多余,还增加了状态同步风险。建议直接使用 array.length 替代 size,或彻底移除 size,仅保留 pointer(表示实际元素个数)。
Gridster.js多列网格式拖动布局插件下载网页中拖动 DIV 是很常见的操作,今天就分享给大家一个 jQuery 多列网格拖动布局插件,和其它的插件不太一样的地方在于你处理拖放的元素支持不同大小,并且支持多列的网格布局,它们会自动的根据位置自己排序和调整。非常适合你开发具有创意的应用。这个插件可以帮助你将任何的 HTML 元素转换为网格组件
立即学习“Java免费学习笔记(深入)”;
print() 方法逻辑错误
当前循环 for (int i = 0; i
✅ 正确实现方案
以下是修复后的完整 Array 类(精简、健壮、符合常规实践):
public class Array {
private int[] array;
private int pointer; // 当前有效元素个数(即逻辑大小)
public Array() {
this(5); // 默认初始容量为5
}
public Array(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("Initial capacity must be non-negative");
}
this.array = new int[initialCapacity];
this.pointer = 0;
}
public void add(int element) {
if (pointer == array.length) { // 容量已满
resize();
}
array[pointer++] = element;
}
private void resize() {
int newCapacity = array.length * 2;
if (newCapacity == 0) newCapacity = 1; // 防止初始为0时翻倍仍为0
int[] temp = new int[newCapacity];
System.arraycopy(array, 0, temp, 0, array.length);
array = temp;
}
public void print() {
for (int i = 0; i < pointer; i++) {
System.out.println(array[i]);
}
}
// 可选:返回当前逻辑大小(类似 ArrayList.size())
public int size() {
return pointer;
}
// 可选:检查是否为空
public boolean isEmpty() {
return pointer == 0;
}
}? 关键改进说明
- 移除了冗余 size 字段:仅用 array.length 表示容量,pointer 表示已存元素数,职责清晰;
- resize() 中正确计算新容量并更新引用:使用 System.arraycopy 提升复制效率(比手动循环更优);
- add() 中先判满再存值,避免越界;
- print() 严格按 pointer 遍历,杜绝无效输出;
- 增加基础防御性检查(如负容量校验)和实用辅助方法(size()、isEmpty()),提升工程可用性。
? 小结
手动实现动态数组本质是「空间换时间」:通过预分配更大内存+数据迁移,换取 O(1) 均摊插入性能。但务必保证容量(array.length)、逻辑大小(pointer)与业务逻辑三者严格一致。若需生产环境使用,推荐直接采用 java.util.ArrayList;若用于学习底层原理,则务必关注状态一致性与边界条件处理。









