java数组长度固定,需通过arrays.copyof或system.arraycopy创建新数组实现扩容缩容,且必须重新赋值引用;频繁变动场景推荐使用arraylist。

Java 中数组一旦创建,长度就固定了,无法直接“动态调整”。但可以通过创建新数组、复制原数据的方式来实现等效效果。核心方法是 System.arraycopy() 或 Arrays.copyOf(),它们高效且简洁。
用 Arrays.copyOf 扩容或缩容
这是最常用、最推荐的方式。它内部调用 native 的 arraycopy,性能好,代码也干净:
- 扩容:把原数组复制到一个更长的新数组中
- 缩容:复制前 N 个元素(N 小于原长度),多余元素自然丢弃
示例:
int[] arr = {1, 2, 3};
arr = Arrays.copyOf(arr, 5); // → {1, 2, 3, 0, 0}
arr = Arrays.copyOf(arr, 2); // → {1, 2}
用 System.arraycopy 手动控制复制
适合需要精细控制的场景,比如只复制某一段、或复制到已有数组中:
- 参数顺序:源数组、源起始索引、目标数组、目标起始索引、复制长度
- 目标数组必须已存在,且长度足够容纳要复制的数据
示例(扩容):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
int[] oldArr = {1, 2, 3};
int[] newArr = new int[5];
System.arraycopy(oldArr, 0, newArr, 0, oldArr.length); // 复制全部
注意:原始引用会丢失
无论哪种方式,你得到的都是一个全新的数组对象,原数组对象不会被修改。所以一定要把返回值重新赋给变量(如 arr = Arrays.copyOf(...)),否则扩容操作就“没生效”。
如果多个变量引用同一个数组,只重赋其中一个,其他变量仍指向旧数组——这不是 bug,而是 Java 对象引用的正常行为。
实际开发中更推荐用 ArrayList
如果频繁增删、不确定大小,直接用 ArrayList 更合适。它底层就是基于数组自动扩容(默认 1.5 倍),封装了所有复制逻辑,用起来更安全、灵活:
List<integer> list = new ArrayList(Arrays.asList(1, 2, 3)); list.add(4); // 自动扩容 list.remove(0); // 自动缩容(逻辑上)</integer>
除非有特殊需求(如极致性能、避免泛型开销、与 JNI 交互),否则不建议手动管理数组长度。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










