system.arraycopy扩容数组的核心是“复制+新建”,它作为jvm底层优化的native方法,直接内存块拷贝,比for循环快2–5倍;需手动创建新数组并调用arraycopy完成数据迁移。

用 System.arraycopy 扩容数组,核心在于“复制+新建”,它比循环赋值快,但本身不改变原数组长度——你需要手动创建更大新数组,再把旧数据拷过去。
为什么 arraycopy 比 for 循环快?
System.arraycopy 是 JVM 底层优化的本地方法(native),直接操作内存块,跳过了 Java 层的边界检查和逐元素访问开销。尤其在大数据量时,性能差距明显。
- 普通 for 循环:每次访问都要检查数组下标,有额外运行时开销
- arraycopy:一次调用完成连续内存拷贝,类似 C 的
memcpy - 实测:百万级 int 数组扩容,arraycopy 通常快 2–5 倍
标准扩容写法(以 int[] 为例)
扩容不是“拉伸”原数组,而是创建新数组 + 复制数据。关键三步:算新容量、建新数组、拷贝。
- 新容量建议:常见策略是当前长度 ×1.5 或 +10%,避免频繁扩容
- 调用格式:
System.arraycopy(src, srcPos, dest, destPos, length) - 示例:int[] newArr = new int[oldArr.length * 2];
System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
注意边界和常见坑
arraycopy 不做自动类型转换或空值校验,参数错就抛异常,得自己兜底。
- 源数组或目标数组为 null →
NullPointerException - 任意下标越界(如
srcPos + length > src.length)→ArrayIndexOutOfBoundsException - 目标数组太小装不下?不会报错,但只拷贝到目标末尾——务必确保
dest.length >= destPos + length - 基本类型数组可直接拷,引用类型数组拷的是引用(浅拷贝),对象本身不复制
封装一个通用扩容工具方法
避免重复写样板代码,可封装成静态工具方法,支持任意一维数组(利用泛型擦除 + Object):
- 输入原数组,返回扩容后新数组
- 内部用
Array.newInstance创建同类型新数组 - 对 null 输入做判空保护,对 length=0 做快速路径
- 实际项目中 ArrayList 就是这么干的——只是它还加了线程安全和容量阈值控制











