system.arraycopy是java中高效复制数组的底层方法,通过内存块拷贝实现,不创建新对象;用于数组扩容时需先新建更大数组,再用arraycopy将原数组元素整体复制过去,参数需严格对齐且类型兼容。

System.arraycopy 是 Java 中高效复制数组元素的底层方法,常用于手动实现数组扩容(比如 ArrayList 的 grow 逻辑)。它不创建新对象,只做内存块拷贝,比循环赋值快得多。
扩容前先创建新数组
数组本身不可变长,扩容本质是:申请一个更大容量的新数组,把旧数据搬进去,再让引用指向新数组。
- 原始数组长度为
oldLength,目标扩容后长度通常为oldLength + increment或按倍数增长(如 1.5 倍) - 用
new Type[newLength]创建新数组 - 调用
System.arraycopy把旧数组内容整体复制过去
arraycopy 参数要对齐
方法签名:System.arraycopy(src, srcPos, dest, destPos, length)
-
src:源数组(原数组) -
srcPos:从源数组哪个下标开始复制(通常为 0) -
dest:目标数组(新数组) -
destPos:复制到目标数组的起始下标(通常为 0) -
length:复制多少个元素(一般等于原数组长度)
例如:原数组 int[] old = {1,2,3},扩容到长度 5:
System.arraycopy(old, 0, newarr, 0, old.length); // 复制全部3个元素
注意类型兼容与边界检查
该方法不做类型自动转换,源和目标数组必须是相同或兼容类型(如 Object[] → String[] 不行,但 Object[] → Object[] 可以)。
- 若
length超出任一数组可访问范围,抛ArrayIndexOutOfBoundsException - 若
src或dest为null,抛NullPointerException - 复制过程中不触发 GC,也不调用任何构造/赋值逻辑,纯内存拷贝
和 Arrays.copyOf 的关系
Arrays.copyOf(original, newLength) 内部就是调用 System.arraycopy 实现的,更简洁安全:
- 自动推导类型、创建新数组、处理边界
- 推荐日常使用
Arrays.copyOf;需要精细控制(如只复制部分、偏移写入)时才直接用arraycopy - 性能上二者几乎无差别,因为后者只是前者的封装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











