杰瑞科技汇

Java List与数组如何高效转换?

转换方向 方法 说明
数组 → List Arrays.asList(array) 最常用,返回一个由数组支持的固定大小List,不能修改其大小(如 add, remove 会抛出 UnsupportedOperationException),但可以修改元素。
new ArrayList<>(Arrays.asList(array)) 创建一个全新的、可修改的 ArrayList,包含数组中的所有元素。
List → 数组 list.toArray() 返回一个Object类型的数组,List 中元素类型不是 Object,则需要强制转换,可能产生 ClassCastException不推荐直接使用
list.toArray(T[] array) 最常用且推荐,可以返回一个与 List 元素类型相同的数组,并且效率更高。

数组 转 List

Arrays.asList(array) - 最常用

这是将数组转换为 List 最直接、最简单的方法。

Java List与数组如何高效转换?-图1
(图片来源网络,侵删)

特点:

  • 它返回的 List 是一个视图,或者说是由原始数组支持的,这意味着对这个 List 的修改(除了修改元素本身)会直接反映到原始数组上,反之亦然。
  • 这个 List大小是固定的,你不能向其中添加或删除元素,否则会抛出 UnsupportedOperationException

代码示例:

import java.util.Arrays;
import java.util.List;
public class ArrayToListExample {
    public static void main(String[] args) {
        // 1. 创建一个字符串数组
        String[] stringArray = {"Apple", "Banana", "Cherry"};
        // 2. 使用 Arrays.asList() 将数组转换为 List
        // 注意:这里使用了钻石操作符 <>,让编译器自动推断泛型类型
        List<String> fruitList = Arrays.asList(stringArray);
        System.out.println("转换后的 List: " + fruitList);
        System.out.println("原始数组: " + Arrays.toString(stringArray));
        // 3. 修改 List 中的元素
        fruitList.set(1, "Blueberry"); // 修改是允许的
        System.out.println("修改 List 后的 List: " + fruitList);
        System.out.println("修改 List 后的数组: " + Arrays.toString(stringArray)); // 数组也被修改了!
        // 4. 尝试添加元素(会抛出异常)
        try {
            fruitList.add("Date");
        } catch (UnsupportedOperationException e) {
            System.out.println("\n错误:不能向固定大小的 List 添加元素。");
            e.printStackTrace();
        }
    }
}

输出:

转换后的 List: [Apple, Banana, Cherry]
原始数组: [Apple, Banana, Cherry]
修改 List 后的 List: [Apple, Blueberry, Cherry]
修改 List 后的数组: [Apple, Blueberry, Cherry]
错误:不能向固定大小的 List 添加元素。
java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    ...

创建一个新的 ArrayList - 可修改的 List

如果你需要一个可以自由修改大小(添加、删除元素)的 List,你需要基于 Arrays.asList() 的结果创建一个新的 ArrayList

Java List与数组如何高效转换?-图2
(图片来源网络,侵删)

特点:

  • 创建一个全新的 ArrayList 对象,与原始数组脱离关系
  • 对新 List 的任何修改都不会影响原始数组。

代码示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayToModifiableList {
    public static void main(String[] args) {
        String[] stringArray = {"Apple", "Banana", "Cherry"};
        // 使用 Arrays.asList() 创建一个 List,然后用它来初始化一个新的 ArrayList
        List<String> modifiableList = new ArrayList<>(Arrays.asList(stringArray));
        System.out.println("初始可修改 List: " + modifiableList);
        // 现在可以安全地添加和删除元素了
        modifiableList.add("Date");
        modifiableList.remove(0); // 移除 "Apple"
        System.out.println("修改后的可修改 List: " + modifiableList);
        System.out.println("原始数组(未受影响): " + Arrays.toString(stringArray));
    }
}

输出:

初始可修改 List: [Apple, Banana, Cherry]
修改后的可修改 List: [Banana, Cherry, Date]
原始数组(未受影响): [Apple, Banana, Cherry]

List 转数组

list.toArray() - 不推荐

这个方法将 List 转换为一个 Object[] 类型的数组。

Java List与数组如何高效转换?-图3
(图片来源网络,侵删)

缺点:

  • 返回的数组是 Object[] 类型,如果你的 List 存放的是特定类型(如 String),你需要强制转换,这可能会在运行时抛出 ClassCastException
  • 不够类型安全,代码可读性差。

代码示例(演示其缺点):

import java.util.ArrayList;
import java.util.List;
public class ListToArrayBadExample {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("Hello");
        stringList.add("World");
        // 不推荐的方式:返回 Object[]
        Object[] objectArray = stringList.toArray();
        // 如果我们想要一个 String[] 数组,必须强制转换
        String[] stringArray = (String[]) stringList.toArray(); // 这行代码会编译,但运行时可能出错
        System.out.println("转换后的数组: " + Arrays.toString(stringArray));
    }
}

注意:在这个特定例子中,因为 List 中确实都是 String,所以强制转换不会失败,但如果 ListList<Object> 并且混入了其他类型的对象,强制转换就会失败。

list.toArray(T[] array) - 推荐使用

这是最安全、最高效的方法,它利用了 Java 的泛型。

特点:

  • 类型安全:返回的数组类型与传入的数组类型相同,无需强制转换。
  • 高效:如果你传入的数组长度大于或等于 List 的大小,List 会直接填充这个数组并返回它,避免了创建新数组的开销。
  • 自动扩容:如果你传入的数组长度小于 List 的大小,或者传入一个空数组(如 new String[0]),toArray 方法会自动创建一个新数组,其大小正好能容纳 List 的所有元素,并将元素复制进去。

最佳实践:传入一个空数组

这是最简洁、最常用的方式,让 toArray 方法为你处理所有事情。

代码示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListToArrayGoodExample {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("Hello");
        stringList.add("World");
        // 推荐方式:传入一个空数组,让 toArray 方法创建正确类型和大小的数组
        String[] stringArray = stringList.toArray(new String[0]);
        System.out.println("转换后的数组: " + Arrays.toString(stringArray));
        // 另一种方式:创建一个足够大的数组
        // String[] anotherArray = new String[stringList.size()];
        // stringList.toArray(anotherArray);
        // System.out.println("另一种方式转换的数组: " + Arrays.toString(anotherArray));
    }
}

输出:

转换后的数组: [Hello, World]

总结与最佳实践

场景 推荐方法 原因
数组 → 只读/视图 List Arrays.asList(array) 高效,直接映射,无需额外内存。
数组 → 可修改 List new ArrayList<>(Arrays.asList(array)) 创建一个独立的、可操作的副本。
List → 数组 list.toArray(new T[0]) 最推荐,类型安全、代码简洁、性能良好,让方法处理数组创建。

记住这些核心区别和推荐用法,你就能在 Java 中轻松自如地处理 List 和数组的转换了。

分享:
扫描分享到社交APP
上一篇
下一篇