1. 概述

本文将介绍如何使用 核心 Java 库、Guava 和 Apache Commons Collections 实现 Array 与 List 之间的相互转换。作为「Java 基础回顾」系列的一部分,我们将聚焦实际开发中最常用的转换方式。

2. 将 List 转换为 Array

2.1. 使用原生 Java

最基础的转换方式,直接调用 toArray() 方法:

@Test
public void givenUsingCoreJava_whenListConvertedToArray_thenCorrect() {
    List<Integer> sourceList = Arrays.asList(0, 1, 2, 3, 4, 5);
    Integer[] targetArray = sourceList.toArray(new Integer[0]);
}

⚠️ 注意:推荐使用 toArray(new T[0]) 而非 toArray(new T[size])。根据 Aleksey Shipilëv 的性能分析,这种方式:

  • ✅ 执行更快
  • ✅ 代码更简洁
  • ✅ 避免潜在线程安全问题

2.2. 使用 Guava

Guava 提供了更简洁的 API,尤其适合基本类型数组:

@Test
public void givenUsingGuava_whenListConvertedToArray_thenCorrect() {
    List<Integer> sourceList = Lists.newArrayList(0, 1, 2, 3, 4, 5);
    int[] targetArray = Ints.toArray(sourceList);
}

3. 将 Array 转换为 List

3.1. 使用原生 Java

直接使用 Arrays.asList() 快速转换:

@Test
public void givenUsingCoreJava_whenArrayConvertedToList_thenCorrect() {
    Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 };
    List<Integer> targetList = Arrays.asList(sourceArray);
}

⚠️ 踩坑提醒:此方法返回的是固定大小的 List,底层仍依赖原数组。如果需要可修改的 ArrayList,需额外包装:

List<Integer> targetList = new ArrayList<>(Arrays.asList(sourceArray));

3.2. 使用 Guava

Guava 的 Lists.newArrayList() 提供了更直观的转换:

@Test
public void givenUsingGuava_whenArrayConvertedToList_thenCorrect() {
    Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 };
    List<Integer> targetList = Lists.newArrayList(sourceArray);
}

3.3. 使用 Commons Collections

Apache Commons Collections 的 CollectionUtils.addAll() 适合预初始化 List:

@Test 
public void givenUsingCommonsCollections_whenArrayConvertedToList_thenCorrect() { 
    Integer[] sourceArray = { 0, 1, 2, 3, 4, 5 }; 
    List<Integer> targetList = new ArrayList<>(6); 
    CollectionUtils.addAll(targetList, sourceArray); 
}

4. 总结

场景 推荐方案 特点
List → Array toArray(new T[0]) 原生、高效
List → 基本类型 Array Guava Ints.toArray() 避免装箱开销
Array → 固定 List Arrays.asList() 轻量级
Array → 可修改 List Guava Lists.newArrayList() 简单粗暴

所有示例代码可在 GitHub 项目 中获取(Maven 项目,可直接导入运行)。


原始标题:Converting Between an Array and a List in Java Baeldung

« 上一篇: Java周报 21