如何转换数组Java中的列表?
我用了Arrays.asList()
但行为(和签名)从Java SE 1.4.2(文档现在档案)以某种方式改变为8,我发现在网络上最段都使用1.4.2行为。
例如:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
在许多情况下,它应该很容易察觉,但有时它可以滑被忽视:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
在你的榜样,那是因为你不能有一个原始类型的列表。换句话说,List<int>
是不可能的。
你可以,但是,必须使用包裹List<Integer>
原始的Integer
类int
。将您的阵列与List
实用方法Arrays.asList
。
Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);
如果你的目标的Java 8(或更高版本),你可以试试这个:
int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
.boxed().collect(Collectors.<Integer>toList());
注意:
注意Collectors.<Integer>toList()
,这个通用方法可以帮助您避免错误“类型不匹配:不能从List<Object>
转换为List<Integer>
”。
你必须投以阵列
Arrays.asList((Object[]) array)
一内胆:
List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
Integer[] array = { 1, 2, 3};
List<Integer> list = Lists.newArrayList(sourceArray);
Integer[] array = { 1, 2, 3};
List<Integer> list = new ArrayList<>(6);
CollectionUtils.addAll(list, array);
所以,这取决于它的Java版本你trying-
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);
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/
如果这可以帮助:我有同样的问题,只是写了一个通用的函数,它接受一个数组,并返回相同类型,具有相同内容的ArrayList:
public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
ArrayList<T> list = new ArrayList<T>();
for(T elmt : array) list.add(elmt);
return list;
}
定的数组:
int[] givenArray = {2,2,3,3,4,5};
转换整数数组为整数列表
方式一:盒装() - >返回IntStream
List<Integer> givenIntArray1 = Arrays.stream(givenArray)
.boxed()
.collect(Collectors.toList());
方式二:流中的每个元素映射到整数,然后收集
注意:使用mapToObj可以通过壳体i到(char)的隐蔽各INT元件成字符串流,焦炭流等我
List<Integer> givenIntArray2 = Arrays.stream(givenArray)
.mapToObj(i->i)
.collect(Collectors.toList());
转换一个阵列类型到另一种类型实施例:
List<Character> givenIntArray2 = Arrays.stream(givenArray)
.mapToObj(i->(char)i)
.collect(Collectors.toList());
使用两个代码行,如果你使用它的整数值,你必须使用自动装箱类型原始数据类型转换数组列表
Integer [] arr={1,2};
Arrays.asList(arr);
在Java 8中,可以使用流:
int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
.boxed()
.collect(Collectors.toList());
谈到转换方式,这取决于你为什么需要你List
。如果你需要它只是读取数据。 OK,在这里你去:
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
时指定类型。
问题是,可变参数得到了在Java5的介绍,不幸的是,Arrays.asList()
得到了可变参数版本超载了。所以Arrays.asList(spam)
由Java5的编译器为INT阵列的可变参数参数的理解。
这个问题在有效的Java第二版,第7章,第42项更多的细节解释。
这似乎有点晚,但这里有我的两分钱。我们不能有List<int>
作为int
是基本类型,所以我们只能有List<Integer>
。
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
如果我们希望有一个具体的实施List
例如ArrayList
那么我们可以用toCollection
为:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
为什么list21
不能被结构修饰?
当我们使用Arrays.asList
返回列表的大小是固定的,因为返回的列表不是java.util.ArrayList
,但里面java.util.Arrays
定义的私有静态类。因此,如果我们添加或删除返回列表中的元素,一个UnsupportedOperationException
将被抛出。因此,我们应该list22
去的时候,我们要修改的列表。如果我们有Java8那么我们还可以一起去list23
。
需要明确的是list21
可以在我们可以称之为list21.set(index,element)
意义上被修改,但这份名单可能不被结构修饰,即不能添加或删除列表中的元素。您还可以检查此question。
如果我们希望有一个不变的名单,然后我们就可以把它包装成:
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
要注意的另一点是,该方法Collections.unmodifiableList
返回指定列表的修改视图。不可修改视图集合是集合,是不可修改的,并且也是图到背衬集合。请注意,变更为后盾收集可能仍然是可能的,如果它们发生,他们是通过修改视图可见。
我们可以在Java中10真正的不可变列表。
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
还要检查我的这个answer更多。
我最近有一个数组转换到一个列表。后来节目筛选列表试图删除这些数据。当您使用Arrays.asList(阵列)功能,您可以创建一个固定大小的集合:你既不能增加也不能删除。该条目解释这个问题比我可以更好地:Why do I get an UnsupportedOperationException when trying to remove an element from a List?。
最后,我不得不做“手册”的转换:
List<ListItem> items = new ArrayList<ListItem>();
for (ListItem item: itemsArray) {
items.add(item);
}
我想我可以添加转换从阵列到使用List.addAll(项目)的操作的列表。
更短:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
这是转换一个数组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!
您可以使用for
循环到阵列中的所有元素添加到List
实现,例如ArrayList
:
List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
list.add(i);
}
你可以把数组转换成流,然后收集使用不同的收藏家流:在屏幕后面的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));
也可以看看:
另一个解决办法,如果你使用Apache公地郎咸平:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));
凡ArrayUtils.toObject转换int[]
到Integer[]