在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
定义的私有静态类。 所以,如果我们从返回的列表中添加或删除元素,将抛出一个UnsupportedOperationException
exception。 所以当我们想要修改列表时我们应该使用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);