Java数组无法真正动态扩容,需通过Arrays.copyOf()或System.arraycopy()创建新数组并复制数据;前者简洁自动填充默认值,后者灵活支持部分复制和偏移;封装扩容方法时建议按比例增长并校验容量;所有操作均返回新数组,原数组不变,须显式赋值更新引用。

Java 中数组本身是固定长度的,无法真正“动态扩容”,但可以通过创建新数组、复制原内容来模拟扩容效果。核心就是用 Arrays.copyOf() 或 System.arraycopy() 把旧数组数据搬到更大的新数组里。
用 Arrays.copyOf 快速扩容
这是最常用也最简洁的方式。它内部调用 System.arraycopy,自动创建指定长度的新数组,并复制原数组全部或部分元素。
- 语法:
int[] newArr = Arrays.copyOf(oldArr, newSize); - 如果
newSize > oldArr.length,新数组后半部分自动填默认值(如 int 填 0) - 如果
newSize < oldArr.length,只复制前 newSize 个元素,相当于截断 - 示例:int[] a = {1, 2, 3}; int[] b = Arrays.copyOf(a, 5); // 得到 {1,2,3,0,0}
用 System.arraycopy 手动控制复制过程
更底层、更灵活,适合需要精确控制起始位置、长度或目标偏移的场景,比如在已有大数组中追加数据。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 语法:
System.arraycopy(src, srcPos, dest, destPos, length); - 必须提前创建好目标数组(dest),且确保容量足够
- 可只复制一部分,或复制到目标数组的任意位置
- 示例:int[] old = {1,2,3}; int[] newarr = new int[6]; System.arraycopy(old, 0, newarr, 0, old.length); // 复制到开头
封装成可复用的扩容方法
实际开发中常把扩容逻辑封装起来,避免重复写样板代码,也能统一处理边界情况(如 null、负数大小)。
立即学习“Java免费学习笔记(深入)”;
- 建议按一定比例增长(如 1.5 倍),而不是每次只加 1,减少频繁扩容开销
- 检查新容量是否合法(不能小于 0,也不能超过
Integer.MAX_VALUE) - 可泛型化支持任意引用类型数组(需用
Object[]+ 类型转换,或借助反射) - 简单示例:static int[] grow(int[] arr, int minCapacity) { return Arrays.copyOf(arr, Math.max(arr.length * 2, minCapacity)); }
注意原始数组不会被修改
所有复制操作都生成新数组,原数组对象保持不变。你需要显式把新数组赋值给原变量,否则扩容无效。
- 错误写法:
Arrays.copyOf(arr, 10); // 没赋值,arr 还是原来的 - 正确写法:
arr = Arrays.copyOf(arr, 10); // 更新引用 - 如果是方法参数传入的数组,扩容后也要返回新数组,调用方需重新接收

















