java原生数组长度固定,动态扩容本质是创建更大新数组并复制数据;插入前需判断if (size + 1 > array.length)触发扩容;应以size遍历,避免读取默认值;推荐用arrays.copyof实现安全扩容。

Java 原生数组长度固定,无法真正“动态扩容”,所谓动态扩容,本质是创建一个更大的新数组,把有效数据复制过去,再用新数组替换原引用。关键不在改长度,而在换容器。
扩容前必须判断空间是否足够
不能等数组满了(size == array.length)才扩容,否则下一次添加就会越界。正确做法是在插入前检查:if (size + 1 > array.length),满足即触发扩容。
- size 表示当前已存的有效元素个数
- array.length 是底层数组的物理容量,二者语义分离,不可混用
- 遍历时也应以 size 为界,避免读到未使用的默认值(如 0、null)
推荐用 Arrays.copyOf 快速完成扩容+复制
这是最简洁安全的方式,一行代码封装了新建数组、复制内容、填充默认值三步操作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- int[] newArr = Arrays.copyOf(oldArr, newSize);
- newSize > oldArr.length:复制全部元素,末尾自动补 0(int)、null(String)等默认值
- newSize
- 返回全新数组,原数组不受影响,旧数组若无其他引用会被 GC 回收
手动控制可用 System.arraycopy
当需要更精细操作(如只复制部分区间、指定起始偏移)时,用 System.arraycopy 更合适:
- 写法:System.arraycopy(src, srcPos, dest, destPos, length);
- 复制长度必须是 有效元素个数(size),不是原数组全长,否则可能拷贝到 null 占位符
- 底层调用 JVM 内存指令,比 for 循环快得多
- 适用于封装工具类或模拟 ArrayList 底层逻辑
扩容策略要合理,避免抖动和浪费
盲目翻倍(×2)浪费内存,每次只加 1 又导致频繁复制。工业级常用 1.5 倍增长:
- 计算方式:newCapacity = oldCapacity + (oldCapacity >> 1);(位运算,等价于 ×1.5)
- 首次扩容建议设为 10(空数组场景兜底)
- 缩容可设阈值,例如 size ≤ capacity / 4 且 capacity > 初始值时,才缩为 capacity / 2
- 注意溢出保护:newCapacity 不得超过 Integer.MAX_VALUE - 8
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










