
本文详细讲解如何在 java 中手动合并两个整型数组,分析常见实现逻辑、验证其正确性,并提供可运行示例、注意事项及优化建议。
本文详细讲解如何在 java 中手动合并两个整型数组,分析常见实现逻辑、验证其正确性,并提供可运行示例、注意事项及优化建议。
在 Java 中,由于数组是固定长度的引用类型,无法直接“扩展”,因此合并两个 int[] 数组需显式创建新数组,并将原数组元素依次复制过去。你提供的 mergeAndOrder 方法(尽管名称中含 “Order”,实际仅执行拼接)逻辑正确,完全能实现两个整型数组的顺序拼接(concatenation),而非排序(sorting)。
以下是该方法的规范重构版本,已修正命名歧义、增强健壮性并添加注释:
/**
* 将两个整型数组按顺序拼接为一个新数组(非排序操作)
* @param array1 第一个数组(可为 null)
* @param array2 第二个数组(可为 null)
* @return 拼接后的新数组;任一输入为 null 时,返回另一数组的副本;两者均为 null 时返回空数组
*/
public static int[] concatenate(int[] array1, int[] array2) {
// 处理 null 输入,避免 NullPointerException
if (array1 == null) array1 = new int[0];
if (array2 == null) array2 = new int[0];
int[] result = new int[array1.length + array2.length];
// 复制第一个数组
System.arraycopy(array1, 0, result, 0, array1.length);
// 复制第二个数组到 result 的后续位置
System.arraycopy(array2, 0, result, array1.length, array2.length);
return result;
}
✅ 为什么你的原始代码是正确的?
-
tmp数组长度准确:array1.length + array2.length; - 第一循环正确填充
tmp[0]到tmp[array1.length - 1]; -
k初始化为array1.length,第二循环从tmp[k]开始赋值,索引无越界风险; - 最终返回的
tmp确实包含array1全部元素后紧跟array2全部元素。
? 验证示例(JUnit 5):
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
@Test
void testConcatenate() {
int[] a = {1, 2, 3};
int[] b = {4, 5};
int[] expected = {1, 2, 3, 4, 5};
int[] actual = concatenate(a, b);
assertArrayEquals(expected, actual);
// 边界测试:空数组
assertArrayEquals(new int[]{1, 2}, concatenate(new int[]{1, 2}, new int[0]));
assertArrayEquals(new int[]{}, concatenate(null, null));
}
⚠️ 注意事项与最佳实践:
-
命名语义清晰:
mergeAndOrder易被误解为“归并+排序”(如归并排序),应改为concatenate或append; -
空值防护:生产代码中务必检查
null输入,否则运行时抛出NullPointerException; -
性能优化:优先使用
System.arraycopy替代手动 for 循环,JVM 对其有深度优化,效率更高且更安全; -
替代方案参考(学习进阶):
- Java 8+:
IntStream.concat(IntStream.of(a), IntStream.of(b)).toArray(); - Apache Commons Lang:
ArrayUtils.addAll(a, b); - 但手动实现仍是理解底层内存与数组行为的重要练习。
- Java 8+:
总结:你的基础逻辑完全正确,只需关注命名准确性、边界处理与标准库工具的合理选用,即可写出健壮、可维护的数组拼接代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











