Java 中 System.arraycopy 怎么处理不同长度数组的复制
System.arraycopy需显式指定复制长度,不会自动适配或扩容。复制成功需保证源和目标数组索引范围不越界,长度参数独立于数组长度。安全做法是取源和目标可用长度的最小值。不支持自动类型转换或填充,可用Arrays.copyOf简化操作。
关于 System.arraycopy 处理不同长度数组的问题,先说一个核心结论:它不会自动适配,也不会智能判断——你指定多少长度,它就复制多少,边界全靠你自己管。很多人一开始以为它能“自动扩容”或者“自动截断”,其实它更像一个极其严格的搬运工,只按你画的路线走,超出路线就抛异常。
整个操作依赖一个关键参数:length(第五个参数),它独立于源数组和目标数组的长度。只要满足三个条件,复制就能顺利进行:
- 源数组索引范围:
srcPos到srcPos + length - 1必须在[0, src.length)内 - 目标数组索引范围:
destPos到destPos + length - 1必须在[0, dest.length)内 length ≥ 0
举个例子:源数组长度是5,目标数组长度是3,你完全可以复制前3个元素,只要设置 srcPos = 0、destPos = 0、length = 3 就行。反过来,如果你想复制6个元素,源数组只有5个,那就会直接抛 ArrayIndexOutOfBoundsException。
复制长度由你显式指定,而非数组长度决定
这一点再强调一下:arraycopy 的第五个参数就是实际复制的元素个数,它和数组长度完全没关系。你说了算,但必须保证不越界。
常见安全做法:取可用长度的最小值
实际开发中,我们经常要把源数组“尽可能多地”复制到目标数组中,比如做数组扩容或截断。这时候一个安全套路是手动计算最大长度:
- 可用源长度:
src.length - srcPos - 可用目标长度:
dest.length - destPos - 实际复制长度:
Math.min(src.length - srcPos, dest.length - destPos)
这样既不会越界,又能充分利用空间。比如一个10个元素的数组,你想把前8个复制到一个长度为6的新数组中,最大能复制 Math.min(10 - 0, 6 - 0) = 6 个——刚好填满目标数组。
注意:不支持自动类型转换或填充
arraycopy 是内存级拷贝,要求源和目标数组元素类型兼容(比如 Object[] → Object[],或者子类数组 → 父类数组),但注意它不会做运行时类型检查——如果类型不匹配,会在运行时报 ArrayStoreException。它也不会帮你补零、截断或扩展数组本身,它只复制你指定的那一段。
替代方案:用 Arrays.copyOf 或流式操作更直观
如果你的目标就是“把一个数组的内容复制到另一个长度不同的数组中”,直接用 Arrays.copyOf(src, newLength) 会更省心,它内部会创建新数组并自动处理长度逻辑。只有当你需要偏移、部分复制或者控制精确的复制范围时,才需要回到 arraycopy 并手动校验边界。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













