system.arraycopy 实现环形数组需分段拷贝处理跨边界读写:写入时若 tail+n 超限,先从 tail 拷贝至末尾,再从开头补足;读取时若 head+n 超限,先从 head 拷贝至末尾,再从开头续拷;封装为工具方法可提升性能与可读性。

System.arraycopy 是 Java 中高效复制数组的底层方法,用它实现环形数组(Circular Array)的关键在于合理处理“越界”时的分段拷贝逻辑。环形数组常用于队列、缓冲区等场景,核心难点是读写位置跨数组首尾时的数据连续性维护。
环形数组的基本结构
环形数组本质是一个固定长度的普通数组,配合两个指针(如 head 和 tail)模拟逻辑上的首尾循环。当指针超出数组边界(≥ capacity 或 ),通过取模运算回绕,但直接用取模做数据搬移效率低——而 System.arraycopy 不支持自动回绕,需手动拆分。
用 arraycopy 处理跨边界写入(如入队)
假设数组为 Object[] buffer,当前写入位置为 tail,要写入 n 个元素。若 tail + n > buffer.length,说明写入会从末尾“绕到”开头,需两次 copy:
- 第一次:从
tail拷贝到数组末尾 →System.arraycopy(src, srcPos, buffer, tail, remain),其中remain = buffer.length - tail - 第二次:剩余元素从数组开头继续写 →
System.arraycopy(src, srcPos + remain, buffer, 0, n - remain)
用 arraycopy 处理跨边界读取(如出队)
类似地,读取 n 个元素,起始位置为 head。若 head + n > buffer.length,也需两段拷贝:
- 第一段:从
head到末尾 →System.arraycopy(buffer, head, dest, destPos, buffer.length - head) - 第二段:从开头补足 →
System.arraycopy(buffer, 0, dest, destPos + (buffer.length - head), n - (buffer.length - head))
避免重复计算,封装成工具方法
可将上述逻辑抽象为两个静态方法,例如:
-
copyIntoCircular(Object[] src, int srcPos, Object[] dst, int dstHead, int len):把 src 的一段写入环形 dst -
copyFromCircular(Object[] src, int srcHead, Object[] dst, int dstPos, int len):从环形 src 读一段到 dst
每次调用前只需判断是否越界,再决定调一次还是两次 arraycopy —— 比逐个元素赋值快数倍,也比反复取模+边界判断更清晰。











