题目
设计一个泛型方法合并两个数组
信息
- 类型:问答
- 难度:⭐⭐
考点
泛型方法, 数组操作, 类型安全
快速回答
实现一个泛型方法合并两个相同类型的数组:
- 使用泛型类型参数
<T>声明方法 - 通过
System.arraycopy实现高效数组合并 - 返回合并后的新数组,保持输入数组不变
- 处理空数组边界情况
问题要求
设计一个泛型方法,接受两个相同类型的数组作为参数,返回合并后的新数组,要求保持元素顺序(第一个数组元素在前)并确保类型安全。
解决方案
public class ArrayUtils {
public static <T> T[] mergeArrays(T[] array1, T[] array2) {
if (array1 == null) return array2;
if (array2 == null) return array1;
// 创建结果数组(使用反射保持泛型类型)
T[] mergedArray = Arrays.copyOf(array1, array1.length + array2.length);
// 复制第二个数组内容
System.arraycopy(array2, 0, mergedArray, array1.length, array2.length);
return mergedArray;
}
}关键原理说明
- 泛型方法声明:
<T>在返回类型前声明类型参数,使方法能处理任意对象类型数组 - 类型安全:编译器会检查传入的 array1 和 array2 必须是相同类型 T 的数组
- 数组创建:
Arrays.copyOf()保留了原始数组的类型信息,避免new T[size]的语法错误 - 高效复制:
System.arraycopy()是本地方法,比循环复制性能更高
使用示例
// 合并字符串数组
String[] arr1 = {"Java", "Python"};
String[] arr2 = {"C++", "JavaScript"};
String[] result = ArrayUtils.mergeArrays(arr1, arr2);
// 输出: [Java, Python, C++, JavaScript]最佳实践
- 空值处理:显式检查 null 输入,避免
NullPointerException - 不变性:返回新数组而非修改输入数组,符合函数式编程原则
- 类型推断:调用时无需显式指定类型,编译器自动推断
<String>
常见错误
- 直接创建泛型数组:
T[] mergedArray = new T[length];会导致编译错误 - 忽略空指针:未检查 null 输入可能导致运行时异常
- 类型擦除问题:错误使用
Object[]转换会引发ClassCastException
扩展知识
- 类型擦除:运行时泛型类型信息被擦除,因此需要借助原始数组的类型信息(通过反射)
- 协变数组:Java 数组是协变的(
String[]是Object[]的子类),但泛型集合不是 - 替代方案:对于集合可使用
List.addAll(),但数组操作更底层高效