Arrays.copyOf从索引0开始按指定长度复制并支持扩容补默认值,Arrays.copyOfRange按左闭右开区间精准切片且不扩容;二者均为浅拷贝、不修改原数组,选择取决于是否需自定义起点或扩容。

Arrays.copyOf:从头开始的长度控制
这个方法只管“要多长”,不管“从哪来”。它固定从原数组索引 0 开始复制,目标数组长度由第二个参数 newLength 决定。
常见用法包括:
- 扩容并补默认值:原数组长度为 4,传入 6 → 新数组前 4 位是原内容,后 2 位填 0(int)或 null(引用类型)
- 截取前 N 位:原数组长度为 10,传入 3 → 新数组只含索引 0、1、2 的元素
- 若 newLength 小于 0,直接抛 NegativeArraySizeException
底层调用 System.arraycopy,性能好,但灵活性受限——起始位置无法调整。
Arrays.copyOfRange:按坐标切片的精准复制
这个方法关注“在哪一段”,接受三个参数:原数组、起始索引(含)、结束索引(不含),语义是左闭右开区间 [from, to)。
立即学习“Java免费学习笔记(深入)”;
典型场景有:
- 提取子数组:如
copyOfRange(arr, 2, 5)拿索引 2、3、4 三个元素 - 跳过头部:日志解析中忽略前两个字段,直接从索引 2 开始读
- 滑动窗口处理:每次取连续 4 个元素做计算,循环改变 from/to
注意:to 可以等于原数组长度(合法),但不能超过;from 不能大于 to,否则抛 IllegalArgumentException;越界会立即报 ArrayIndexOutOfBoundsException。
关键区别一目了然
两者都返回新数组,不修改原数组,也都是浅拷贝。核心差异在于:
- 起点是否固定:copyOf 总是从 0 开始;copyOfRange 起点完全自定义
-
长度来源不同:copyOf 的 newLength 是结果数组总长;copyOfRange 的长度由
to - from推出 - 越界行为不同:copyOf 允许 newLength > 原数组长度(自动补默认值);copyOfRange 要求 from 和 to 都在合法范围内,不扩容、不填充
- null 安全一致:传入 null 数组,两者都抛 NullPointerException
怎么选?看你的需求关键词
如果任务描述里带这些词,优先选对应方法:
- “扩容”“初始化预留空间”“取前几个” → Arrays.copyOf
- “第3到第7位”“去掉前缀”“协议字段偏移”“分段处理” → Arrays.copyOfRange
没有所谓“更好”,只有更贴合。日常开发中,copyOfRange 因其语义清晰、不易误用,在数据切片类逻辑中出现频率更高。


















