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

我使用了Arrays.asList(),但行为(和签名)不知怎么地从Java SE 1.4.2(文档现在存档)改变到8,我在web上找到的大多数代码片段都使用1.4.2行为。

例如:

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

在1.4.2返回一个包含元素1,2,3的列表 在1.5.0+上返回包含数组'numbers'的列表

在许多情况下,它应该很容易被发现,但有时它会被忽视:

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

当前回答

给定的数组:

    int[] givenArray = {2,2,3,3,4,5};

将整数数组转换为整数列表

一种方法:boxxed() ->返回IntStream

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

第二种方法:将流的每个元素映射为Integer,然后收集

注意: 使用mapToObj你可以隐蔽每个int元素到字符串流,字符流等套管i (char)i

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

其他回答

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

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

注意:

注意collector .<Integer>toList(),这个泛型方法可以帮助你避免错误“类型不匹配:不能从List<Object>转换到List<Integer>”。

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

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

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

我想我可以使用list . addall (items)操作添加从数组到列表的转换。

我们不能有List<int>,因为int是一个基本类型,所以我们只能有List<Integer>。

Java 16

Java 16在Stream API上引入了一个名为toList()的新方法。这个方便的方法返回一个包含流元素的不可修改的List。因此,尝试向列表中添加新元素只会导致UnsupportedOperationException异常。

int[] ints = new int[] {1,2,3,4,5};
Arrays.stream(ints).boxed().toList();

Java 8 (int array)

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

Java 8及以下版本(整数数组)

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 ?

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

需要明确的是,list21可以被修改,我们可以调用list21.set(index,element),但这个列表不能在结构上被修改,即不能从列表中添加或删除元素。你也可以查看我的这个答案,以获得更多解释。


如果我们想要一个不可变列表,那么我们可以将它包装为:

List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers));

另一点需要注意的是Collections方法。unmodifiableList返回指定列表的不可修改视图。不可修改的视图集合是不可修改的集合,也是备份集合上的视图。注意,对备份集合的更改仍然是可能的,如果发生更改,则通过不可修改的视图可见。

在Java 9和10中,我们可以有一个真正的不可变列表。

真正的不可变列表

Java 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

Java 10(真正不可变列表):

我们可以使用List。Java 9中引入的。还有其他方式:

List.copyOf(Arrays.asList(integers)) Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

给定的数组:

    int[] givenArray = {2,2,3,3,4,5};

将整数数组转换为整数列表

一种方法:boxxed() ->返回IntStream

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

第二种方法:将流的每个元素映射为Integer,然后收集

注意: 使用mapToObj你可以隐蔽每个int元素到字符串流,字符流等套管i (char)i

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

你必须转换为数组

Arrays.asList((Object[]) array)