侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

设计一个泛型方法合并两个数组

2025-12-6 / 0 评论 / 4 阅读

题目

设计一个泛型方法合并两个数组

信息

  • 类型:问答
  • 难度:⭐⭐

考点

泛型方法, 数组操作, 类型安全

快速回答

实现一个泛型方法合并两个相同类型的数组:

  1. 使用泛型类型参数 <T> 声明方法
  2. 通过 System.arraycopy 实现高效数组合并
  3. 返回合并后的新数组,保持输入数组不变
  4. 处理空数组边界情况
## 解析

问题要求

设计一个泛型方法,接受两个相同类型的数组作为参数,返回合并后的新数组,要求保持元素顺序(第一个数组元素在前)并确保类型安全。

解决方案

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(),但数组操作更底层高效