system.arraycopy实现高性能数组切片,核心是内存块级拷贝而非对象创建,需预先分配目标数组并校验边界,推荐封装工具方法及复用缓冲区以降低gc压力。

System.arraycopy 实现高性能数组切片,核心在于绕过对象创建和逐元素循环,直接进行内存块级拷贝——它不生成新数组,但要求你提前分配好目标容器,并精准控制起始位置与长度。
切片本质是“已有数组间的精准搬运”
所谓切片,不是语法糖,而是把源数组某段连续内容,按指定长度复制到另一个已存在的数组中。关键点:
- 必须手动 new 出目标数组,例如
int[] slice = new int[3] - 调用格式固定:
System.arraycopy(src, from, dest, 0, length) -
from是起始索引(含),length是元素个数(不是结束索引) - 例如截取
{1,2,3,4,5}的索引 1 到 3(即[2,3,4]),写法是:System.arraycopy(arr, 1, slice, 0, 3)
必须做边界校验,否则运行时崩溃
五个参数任一越界都会抛 ArrayIndexOutOfBoundsException,不能依赖 try-catch,而应在调用前主动检查:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
src != null且dest != null -
from ≥ 0且from + length ≤ src.length -
0 ≥ 0(destPos 通常为 0)且length ≤ dest.length - 推荐封装工具方法,如
subArray(int[] arr, int from, int to),按左闭右开区间设计,内部算出length = to - from
高频场景下复用缓冲区,压降 GC 压力
如果同一源数组需反复截取不同片段(如日志解析、协议包拆解),每次都 new 小数组会触发频繁 GC。更优做法:
- 预分配一个足够大的缓冲数组,比如
byte[] buffer = new byte[8192] - 每次只用
System.arraycopy(src, offset, buffer, 0, actualLen)搬运真实数据 - 最后用
Arrays.copyOf(buffer, actualLen)裁剪出结果(仅一次小数组分配) - 比每次都
new int[len]节省 90% 以上内存分配开销
别和 Arrays.copyOfRange 混用
Arrays.copyOfRange 看似方便,但它内部就是先 new 数组再调 arraycopy——多了一次对象分配和初始化。在性能敏感路径上:
- 已有目标数组?直接用
arraycopy,零额外开销 - 需要新数组且长度固定?仍建议手写 new + arraycopy,逻辑更可控
- 只是临时简单截取、不频繁调用?
copyOfRange可读性更好,但清楚代价
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










