如何在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);

当前回答

更短:

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

其他回答

使用番石榴: Integer[] array = {1,2,3}; List<Integer> List = Lists.newArrayList(sourceArray); 使用Apache Commons Collections: Integer[] array = {1,2,3}; List<Integer> List = new ArrayList<>(6); CollectionUtils。addAll(列表、数组);

如果您正在尝试优化内存等(并且不想引入外部库),那么实现您自己的不可变“数组视图列表”比您想象的要简单——您只需要扩展java.util.AbstractList。

class IntArrayViewList extends AbstractList<Integer> {
    int[] backingArray;
    int size;

    IntArrayViewList(int[] backingArray, int size) {
        this.backingArray = backingArray;
        this.size = size;
    }

    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = 0;

            @Override
            public boolean hasNext() {
                return i < size;
            }

            @Override
            public Integer next() {
                return get(i++);
            }
        };
    }

    public int size() {
        return size;
    }

    public Integer get(int i) {
        return backingArray[i];
    }
}

我也遇到过同样的问题,写了一个泛型函数,它接受一个数组,并返回一个具有相同内容的相同类型的ArrayList:

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

一行程序:

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

我们不能有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());