在使用Arrays.asList()时如何向List中添加元素

50

我们无法对从Arrays.asList获取的集合执行<Collection>.add或者<Collection>.addAll操作,只有删除操作是允许的。

那么如果我遇到这样一个场景:我需要在List中添加新元素而不删除先前的元素。我该如何实现?


为什么你不能相加?asList返回一个新的ArrayList。哦,这不是同一个ArrayList - Sotirios Delimanolis
7
Arrays.asList 返回的列表由传入的数组支持,且不可修改。根据文档(强调部分),"返回一个由指定数组支持的固定大小列表。(对返回的列表进行更改会“写入”到数组中。)此方法充当基于数组和基于集合的 API 之间的桥梁,与 Collection.toArray() 结合使用。返回的列表可串行化并实现 RandomAccess。" - Joshua Taylor
1
@JoshuaTaylor 没有注意到它是 java.util.Arrays.ArrayList - Sotirios Delimanolis
@SotiriosDelimanolis 对的,我的意思是_javadoc_并不保证你会得到一个java.util.Arrays.ArrayList,只是保证你会得到一个固定大小的List(所以当试图改变其大小时,抛出UnsupportedOperationException是有道理的)。然而,java.util.ArrayList(不是java.util.Arrays$ArrayList)是“List接口的可调整大小的数组实现”,根据文档 - Joshua Taylor
1
@prafulsurve Arrays.asList返回的列表大小是固定的,因此无法执行删除操作。通过简单的测试可以确认,无法向列表中添加元素或者删除元素。 - Joshua Taylor
显示剩余2条评论
8个回答

85

使用构造函数创建一个新的ArrayList

List<String> list = new ArrayList<String>(Arrays.asList("a", "b"));

4
或者 Stream.of("a", "b", "c").collect(Collectors.toList()) 可以翻译为:将字符串 "a"、"b" 和 "c" 转换为流,并将其收集到一个列表中。 - B. Stackhouse

15

一种方法是构造一个新的 ArrayList

List<T> list = new ArrayList<T>(Arrays.asList(...));

在完成这一步之后,您可以随心所欲地修改list


6

Arrays.asList()方法会生成一个列表,实际上它是由数组支持的,这个数组被转换成了列表。虽然你可以把它当作列表使用,但是你不能执行一些操作,例如添加新元素。所以最好的选择是将它传递给另一个列表对象的构造函数,像这样:

List<T> list = new ArrayList<T>(Arrays.asList(...));

4

您可以使用Java8流绕过中间的ArrayList

    Integer[] array = {1, 2, 3};
    List<Integer> list = Streams.concat(Arrays.stream(array),
                                        Stream.of(4)).collect(Collectors.toList());

这应该相当高效,因为它只需遍历数组并预先分配目标列表。对于大型数组可能更好,也可能不是。像往常一样,如果这很重要,你需要进行测量。


3

3

现在,使用流API可以以简洁和功能强大的方式轻松获取 ArrayList

Stream.of("str1", "str2").collect(Collectors.toList()));

当然,这也有灵活性可以使用映射进行转换。例如,在编写Spring安全代码的单元测试时,编写以下内容非常方便:

Stream.of("ROLE_1", "ROLE_2").map(SimpleGrantedAuthority::new).collect(Collectors.toList()));
Collectors.toList 返回的列表是一个 ArrayList,可以通过您的代码根据需要进行修改。

0

Arrays.asList()

创建对象时生成一个不可修改的列表。您可以使用以下代码。

List list = Collections.synchronizedList(new ArrayList(...));

这个转换器允许列表添加和删除对象。我只在Java 8中进行了测试。


0
ArrayList<Object> MyObjectList = new ArrayList<>();
Arrays.asList(params[1]).forEach((item)-> {
    MyObjectList.add(item);
});

3
谢谢您的贡献! 然而,您应该在您的答案中添加一些评论来解释您的解决方案相对于已接受答案的优势,或者新的情况是什么使得您的解决方案更加有吸引力。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接