将数组转换为 Java 中的列表

如何在 Java 中将数组转换为列表?

我使用了Arrays.asList()但是其行为(和签名)从 Java SE 1.4.2 (现在已在文档中存档)更改为8,并且在网络上找到的大多数代码片段都使用 1.4.2 行为。

例如:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 在 1.4.2 上返回包含元素 1,2,3 的列表
  • 在 1.5.0 + 上返回包含垃圾邮件数组的列表

在许多情况下,它应该很容易检测到,但是有时它可能会被忽略而不会引起注意:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

答案

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);
int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());
Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);
list.add(1);
Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

问题是 Java5 中引入了 varargs,不幸的是, Arrays.asList()也使用 vararg 版本重载了。因此,Java5 编译器将Arrays.asList(spam)理解为 int 数组的 vararg 参数。

此问题在有效的 Java 第二版,第 7 章,项目 42 中有更详细的说明。

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());
Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only
ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);
List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!
List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}
List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));
int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());