Java中数组转列表:10分钟从新手到专家
\n\n您是否曾经写过一段代码,它完美地处理数组,但后来突然需要列表?或者更糟的是,当您尝试向从数组创建的列表中添加元素时,收到了一个神秘的异常?如果是这样——您来对地方了。
\n\n在Java中将array转换为list,是一个看似简单却暗藏许多陷阱的任务。在Stack Overflow上,这个问题获得了数十万次浏览,这并非偶然:在简单的表象背后,隐藏着与集合相关的重要细节。
\n\n在本文中,我们将探讨所有在Java中将数组转换为列表的合法方法,学习如何避免典型错误,并弄清楚在特定情况下应选择哪种方法。我们开始吧!
\n\n为什么简单的Arrays.asList()是一个陷阱?
\n\n在Java中将数组转换为列表最流行的方法是Arrays.asList()。它看起来出奇地简单:
String[] fruits = {"apple", "banana", "cherry"};\nList<String> fruitList = Arrays.asList(fruits);\n\n就这样?差不多。但有三个重要的“但是”,并非所有人都知道:
\n\n1. 大小固定
\n通过Arrays.asList()获得的列表具有固定大小。尝试添加一个元素:
fruitList.add("orange"); // UnsupportedOperationException!\n\n您将得到UnsupportedOperationException。为什么?因为在底层,这并不是一个真正的ArrayList,而是一个内置的实现,它只是包装了数组。
2. 对数组的更改会反映在列表中
\n列表是原始数组的一个“窗口”。更改数组,列表也会随之更改:
\n\nfruits[0] = "apricot";\nSystem.out.println(fruitList.get(0)); // apricot\n\n这可能导致难以发现的错误,特别是当数组在方法之间传递时。
\n\n3. 原始类型不起作用
\n尝试将int数组转换为列表:
\n\nint[] 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\nString[] colors = {"red", "green", "blue"};\nList<String> colorList = Arrays.asList(colors);\n// 有效:读取、替换元素\ncolorList.set(0, "yellow");\n// 无效:添加、删除\n\n方法2:创建新的ArrayList
\n在Java中将数组转换为ArrayList最安全的方法是创建一个新实例:
\n\nString[] 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\nString[] 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);