Java中数组转列表:5种方法与陷阱

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java中数组转列表:10分钟从新手到专家

\n\n

您是否曾经写过一段代码,它完美地处理数组,但后来突然需要列表?或者更糟的是,当您尝试向从数组创建的列表中添加元素时,收到了一个神秘的异常?如果是这样——您来对地方了。

\n\n

在Java中将array转换为list,是一个看似简单却暗藏许多陷阱的任务。在Stack Overflow上,这个问题获得了数十万次浏览,这并非偶然:在简单的表象背后,隐藏着与集合相关的重要细节。

\n\n

在本文中,我们将探讨所有在Java中将数组转换为列表的合法方法,学习如何避免典型错误,并弄清楚在特定情况下应选择哪种方法。我们开始吧!

\n\n

为什么简单的Arrays.asList()是一个陷阱?

\n\n

在Java中将数组转换为列表最流行的方法是Arrays.asList()。它看起来出奇地简单:

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nList<String> fruitList = Arrays.asList(fruits);
\n\n

就这样?差不多。但有三个重要的“但是”,并非所有人都知道:

\n\n

1. 大小固定

\n

通过Arrays.asList()获得的列表具有固定大小。尝试添加一个元素:

\n\n
fruitList.add("orange"); // UnsupportedOperationException!
\n\n

您将得到UnsupportedOperationException。为什么?因为在底层,这并不是一个真正的ArrayList,而是一个内置的实现,它只是包装了数组。

\n\n

2. 对数组的更改会反映在列表中

\n

列表是原始数组的一个“窗口”。更改数组,列表也会随之更改:

\n\n
fruits[0] = "apricot";\nSystem.out.println(fruitList.get(0)); // apricot
\n\n

这可能导致难以发现的错误,特别是当数组在方法之间传递时。

\n\n

3. 原始类型不起作用

\n

尝试将int数组转换为列表:

\n\n
int[] numbers = {1, 2, 3};\nList<int[]> list = Arrays.asList(numbers); // 不是 List<Integer>,而是 List<int[]>!
\n\n

您得到的不是数字列表,而是一个包含单个元素(整个数组)的列表。Java不能自动将原始类型装箱到列表中。

\n\n

在Java中将数组转换为列表的5种方法

\n\n

让我们通过示例和解释来回顾所有主要的在Java中将数组转换为列表的方法。

\n\n

方法1:经典的Arrays.asList()

\n

适用于您只需要一个只读列表,或者您确定不会更改其大小的情况。

\n\n
String[] colors = {"red", "green", "blue"};\nList<String> colorList = Arrays.asList(colors);\n// 有效:读取、替换元素\ncolorList.set(0, "yellow");\n// 无效:添加、删除
\n\n

方法2:创建新的ArrayList

\n

在Java中将数组转换为ArrayList最安全的方法是创建一个新实例:

\n\n
String[] animals = {"cat", "dog", "bird"};\nList<String> animalList = new ArrayList<>(Arrays.asList(animals));\n// 现在可以添加和删除\nanimalList.add("fish"); // OK
\n\n

这种方法提供了一个完全可变的列表,独立于原始数组。

\n\n

方法3:Collections.addAll()

\n

一种优雅的将数组转换为Java集合的方法。当列表已经存在时特别有用:

\n\n
String[] cities = {"Moscow", "Paris", "London"};\nList<String> cityList = new ArrayList<>();\nCollections.addAll(cityList, cities);\n// 或者一行代码:\nList<String> cityList2 = new ArrayList<>(cities.length);\nCollections.addAll(cityList2, cities);

博客

书籍推荐