copywithin 是原地内存操作,不创建新数组、不触发 gc、不改变数组长度;仅复制引用或值,支持重叠安全覆盖,时间复杂度 o(k),空间复杂度 o(1)。

copyWithin 不创建新数组,只在原数组内部移动元素,属于内存原地操作,不涉及堆内存分配。
copyWithin 是浅层内存移动,不触发 GC
它直接复制已有元素的引用(对对象)或值(对原始类型),不新建任何元素,因此不会增加内存占用,也不会触发垃圾回收。例如:
- 对数字、字符串等原始类型:逐个复制值,无额外内存开销
- 对对象、数组等引用类型:仅复制引用地址,原对象本身不被复制或移动
- 即使目标区域与源区域重叠,也是按从左到右(或右到左)安全覆盖,不依赖临时缓冲区
性能优势:零拷贝语义,适合大数组局部更新
相比 slice + splice 或展开运算符,copyWithin 避免了创建中间数组,尤其在处理万级以上长度的数组时更高效:
- 时间复杂度为 O(K),K 是复制的元素个数,而非整个数组长度
- 空间复杂度稳定为 O(1),无额外堆内存申请
- 适用于滚动日志、环形缓冲区、滑动窗口等需局部平移数据的场景
注意边界与重叠行为:影响实际内存读写顺序
copyWithin 的第三个参数(end)是可选的,默认为数组长度;当 target > start 且存在重叠时,引擎会自动从尾部开始复制,防止覆盖未读取的数据:
- 若 target ≤ start:正向复制(类似 memmove)
- 若 target > start:反向复制,确保源数据未被提前覆盖
- 越界索引会被自动截断,不抛错但可能复制少于预期的元素
无法替代深拷贝,也不改变数组长度
它只是重排已有位置上的内容,不新增、不删除、不深克隆:
- 数组 length 不变,length 属性和内存容量均不受影响
- 嵌套对象仍共享同一引用,修改副本会影响原对象
- 如需深拷贝,请配合 structuredClone、JSON 序列化或递归实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











