发布于2026-07-04 阅读(0)
扫一扫,手机访问
关于 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 - srcPosdest.length - destPosMath.min(src.length - srcPos, dest.length - destPos)这样既不会越界,又能充分利用空间。比如一个10个元素的数组,你想把前8个复制到一个长度为6的新数组中,最大能复制 Math.min(10 - 0, 6 - 0) = 6 个——刚好填满目标数组。
arraycopy 是内存级拷贝,要求源和目标数组元素类型兼容(比如 Object[] → Object[],或者子类数组 → 父类数组),但注意它不会做运行时类型检查——如果类型不匹配,会在运行时报 ArrayStoreException。它也不会帮你补零、截断或扩展数组本身,它只复制你指定的那一段。
如果你的目标就是“把一个数组的内容复制到另一个长度不同的数组中”,直接用 Arrays.copyOf(src, newLength) 会更省心,它内部会创建新数组并自动处理长度逻辑。只有当你需要偏移、部分复制或者控制精确的复制范围时,才需要回到 arraycopy 并手动校验边界。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8