在Java中将数组转换为列表

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

我使用了Arrays.asList()但行为(和签名)以某种方式从Java SE 1.4.2 (文档现在归档)更改为8 ,我在网上find的大多数代码片段都使用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); 

在你的例子中,这是因为你不能有一个基本types的列表。 换句话说, List<int>是不可能的。 但是,您可以有一个List<Integer>

 Integer[] spam = new Integer[] { 1, 2, 3 }; Arrays.asList(spam); 

这按预期工作。

问题是可变参数是在Java5中引入的,不幸的是, Arrays.asList()也被重载了一个可变参数版本。 所以Arrays.asList(spam)被Java5编译器理解为int数组的可变参数。

有效的Java第2版,第7章,第42项更详细地解释了这个问题。

谈到转换方式,这取决于你为什么需要你的List 。 如果你只是需要它来读取数据。 好的,在这里你去:

 Integer[] values = { 1, 3, 7 }; List<Integer> list = Arrays.asList(values); 

但是,如果你做这样的事情:

 list.add(1); 

你得到java.lang.UnsupportedOperationException 。 所以在某些情况下,你甚至需要这个:

 Integer[] values = { 1, 3, 7 }; List<Integer> list = new ArrayList<Integer>(Arrays.asList(values)); 

第一种方法实际上不转换数组,而是像“ List ”那样“代表”。 但是数组的所有属性如固定数量的元素都在引擎盖下。 请注意,在构造ArrayList时需要指定types。

在Java 8中,您可以使用stream:

 int[] spam = new int[] { 1, 2, 3 }; Arrays.stream(spam) .boxed() .collect(Collectors.toList()); 

这似乎不迟,但这是我的两分钱。 我们不能让List<int>成为int因此我们只能有List<Integer> 。 考虑一下我们有一个ints数组并使用Java 8的情况

  int[] ints = new int[] {1,2,3,4,5}; List<Integer> list11 = Arrays.stream(ints).boxed().collect(Collectors.toList()); // Supported by Java 8 

Integer数组的情况下,我们可以使用:

 Integer[] integers = new Integer[] {1,2,3,4,5}; List<Integer> list21 = Arrays.asList(integers); // Cannot modify returned list List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 

为什么list21不能被修改?

当我们使用Arrays.asList时,返回列表的大小是固定的,因为返回的列表不是java.util.ArrayList ,而是java.util.Arrays定义的私有静态类。 所以,如果我们从返回的列表中添加或删除元素,将抛出一个UnsupportedOperationExceptionexception。 所以当我们想要修改列表时我们应该使用list22 。 如果我们有Java8,那么我们也可以使用list23

我最近不得不将数组转换为List。 稍后该程序过滤试图删除数据的列表。 当您使用Arrays.asList(数组)函数时,您将创build一个固定大小的集合:您既不能添加也不能删除。 这个入口比我更好地解释了这个问题: 当我试图从列表中移除一个元素时,为什么会得到一个UnsupportedOperationException呢? 。

最后,我不得不做一个“手动”转换:

  List<ListItem> items = new ArrayList<ListItem>(); for (ListItem item: itemsArray) { items.add(item); } 

我想我可以使用List.addAll(items)操作将一个数组转换为一个列表。

更短:

 List<Integer> list = Arrays.asList(1, 2, 3, 4); 

你必须投入数组

 Arrays.asList((Object[]) array) 

一内胆:

 List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4}); 

如果你的目标是Java 8(或更高版本),你可以试试这个:

 int[] numbers = new int[] {1, 2, 3, 4}; List<Integer> integers = Arrays.stream(numbers) .boxed().collect(Collectors.<Integer>toList()); 

注意:

注意Collectors.<Integer>toList() ,这个通用的方法可以帮助你避免“types不匹配:不能从列表转换为列表”的错误。

使用数组

这是将数组转换为List的最简单的方法。 但是,如果尝试添加新元素或从列表中删除现有元素,则会引发UnsupportedOperationException

 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! 

使用ArrayList或其他列表实现

您可以使用for循环将数组的所有元素添加到List实现中,例如ArrayList

 List<Integer> list = new ArrayList<>(); for (int i : new int[]{1, 2, 3}) { list.add(i); } 

在Java 8中使用Stream API

您可以将数组转换为stream,然后使用不同的收集器收集stream:Java 8中的默认收集器在屏幕后面使用ArrayList ,但是您也可以强制实施您的首选实现。

 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)); 

也可以看看:

  • 为什么我们在Java中使用自动装箱和拆箱?
  • 何时通过ArrayList使用LinkedList?

另一个解决方法,如果你使用apache的commons-lang:

 int[] spam = new int[] { 1, 2, 3 }; Arrays.asList(ArrayUtils.toObject(spam)); 

ArrayUtils.toObject将int[]转换为Integer[]

所以这取决于你正在尝试的Java版本 –

Java 7

  Arrays.asList(1, 2, 3); 

要么

  final String arr[] = new String[] { "G", "E", "E", "K" }; final List<String> initialList = new ArrayList<String>() {{ add("C"); add("O"); add("D"); add("I"); add("N"); }}; // Elements of the array are appended at the end Collections.addAll(initialList, arr); 

要么

 Integer[] arr = new Integer[] { 1, 2, 3 }; Arrays.asList(arr); 

在Java 8中

 int[] num = new int[] {1, 2, 3}; List<Integer> list = Arrays.stream(num) .boxed().collect(Collectors.<Integer>toList()) 

参考http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/

如果这有帮助:我有同样的问题,只是写了一个generics函数接受一个数组,并返回一个具有相同内容的相同types的ArrayList:

 public static <T> ArrayList<T> ArrayToArrayList(T[] array) { ArrayList<T> list = new ArrayList<T>(); for(T elmt : array) list.add(elmt); return list; } 

使用两行代码将数组转换为列表(如果使用整数值),则必须对原始数据types使用自动装箱types

  Integer [] arr={1,2}; Arrays.asList(arr);