我们不能对从 .. 获得的集合执行<Collection>.add
或操作,只允许删除操作。 <Collection>.addAll
Arrays.asList
那么,如果我遇到需要添加新元素List
而不删除之前的元素的情况List
怎么办?我怎样才能做到这一点?
ArrayList
使用构造函数创建一个新的:
List<String> list = new ArrayList<String>(Arrays.asList("a", "b"));
一种方法是构造一个新的ArrayList
:
List<T> list = new ArrayList<T>(Arrays.asList(...));
完成后,您可以随意修改list
。
Arrays.asList(),生成一个实际上由数组支持的列表,它是一个变形为列表的数组。您可以将其用作列表,但不能对其执行某些操作,例如添加新元素。所以最好的选择是将它传递给另一个列表 obj 的构造函数,如下所示:
List<T> list = new ArrayList<T>(Arrays.asList(...));
ArrayList
您可以使用 Java8 流绕过中间体:
Integer[] array = {1, 2, 3};
List<Integer> list = Streams.concat(Arrays.stream(array),
Stream.of(4)).collect(Collectors.toList());
这应该非常有效,因为它可以遍历数组并预先分配目标列表。对于大型阵列,它可能会更好,也可能不会更好。与往常一样,如果重要,您必须进行衡量。
集合的构造函数,例如下面的示例中的 ArrayList,将数组作为列表并使用该列表的元素构造一个新实例。
List<T> list = new ArrayList<T>(Arrays.asList(...));
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection)
这些天来,流 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
并且可以根据您的代码的需要进行修改。
Arrays.asList()
在对象创建时生成一个不可修改的列表。您可以使用以下代码。
List list = Collections.synchronizedList(new ArrayList(...));
此转换允许列表添加和删除对象。我只在 java 8 中测试过。
ArrayList<Object> MyObjectList = new ArrayList<>();
Arrays.asList(params[1]).forEach((item)-> {
MyObjectList.add(item);
});