Arrays.copyOf从索引0开始复制指定长度,支持扩容补默认值;Arrays.copyOfRange按起始和结束索引复制子数组,要求边界合法且不自动扩容。

Arrays.copyOf 和 Arrays.copyOfRange 都用于复制数组,但核心区别在于:前者从原数组开头复制指定长度,后者可任意指定起始和结束位置。
Arrays.copyOf:固定从索引 0 开始复制
该方法接收原数组和目标长度两个参数。若新长度大于原数组长度,多出位置用默认值(如 int 为 0,Object 为 null)填充;若小于,则只取前 N 个元素。
- 适用于“截取前 N 个”或“扩容并初始化”的场景
- 底层调用
System.arraycopy,效率高 - 示例:
int[] a = {1,2,3}; int[] b = Arrays.copyOf(a, 5);→b为{1,2,3,0,0}
Arrays.copyOfRange:支持任意区间复制
该方法接收原数组、起始索引(含)、结束索引(不含)三个参数。越界会抛 ArrayIndexOutOfBoundsException,不自动扩容或补默认值。
- 适用于“提取子数组”“跳过前缀”“分段处理”等需求
- 结束索引可以等于原数组长度(合法),但不能更大
- 示例:
int[] a = {1,2,3,4,5}; int[] c = Arrays.copyOfRange(a, 2, 4);→c为{3,4}
关键行为差异总结
两者都返回新数组,不修改原数组。但:
立即学习“Java免费学习笔记(深入)”;
-
copyOf的“长度”是结果数组长度,起始固定为 0;copyOfRange的“范围”由两个下标决定,更灵活 -
copyOf允许目标长度超过原数组长度;copyOfRange要求from <= to <= original.length - 对 null 数组,两者均抛
NullPointerException
选哪个?看你要复制的“起点”是否固定
如果总是从头开始,比如实现动态扩容逻辑,用 copyOf 更简洁;如果要切片、滑动窗口、解析协议字段等,必须用 copyOfRange。
不复杂但容易忽略边界语义。










