商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java 中 System.arraycopy 怎么处理不同长度数组的复制

Java 中 System.arraycopy 怎么处理不同长度数组的复制

  发布于2026-07-04 阅读(0)

扫一扫,手机访问

关于 System.arraycopy 处理不同长度数组的问题,先说一个核心结论:它不会自动适配,也不会智能判断——你指定多少长度,它就复制多少,边界全靠你自己管。很多人一开始以为它能“自动扩容”或者“自动截断”,其实它更像一个极其严格的搬运工,只按你画的路线走,超出路线就抛异常。

整个操作依赖一个关键参数:length(第五个参数),它独立于源数组和目标数组的长度。只要满足三个条件,复制就能顺利进行:

  • 源数组索引范围:srcPossrcPos + length - 1 必须在 [0, src.length)
  • 目标数组索引范围:destPosdestPos + length - 1 必须在 [0, dest.length)
  • length ≥ 0

举个例子:源数组长度是5,目标数组长度是3,你完全可以复制前3个元素,只要设置 srcPos = 0destPos = 0length = 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 并手动校验边界。

本文转载于:https://www.php.cn/faq/2754302.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注