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

当前回答

我也遇到过同样的问题,写了一个泛型函数,它接受一个数组,并返回一个具有相同内容的相同类型的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(1, 2, 3, 4);

问题是在Java 5中引入了可变参数,不幸的是,Arrays.asList()也重载了一个可变参数版本。因此arrays. aslist (numbers)被Java 5编译器理解为int数组的可变参数。

这个问题在Effective Java第二版,第7章,第42项中有更详细的解释。

在您的示例中,这是因为您不能拥有原始类型的List。换句话说,List<int>是不可能的。

但是,您可以使用包装int原语的Integer类来拥有一个List<Integer>。使用数组将数组转换为List。asList实用程序方法。

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

请在IdeOne.com上查看实时运行的代码。

使用此函数将Array arr转换为List。 Arrays.stream (arr) .collect (Collectors.toList ());

定义泛型方法将数组转换为列表的示例:

public <T> List<T> fromArrayToList(T[] a) {   
    return Arrays.stream(a).collect(Collectors.toList());
}

说到转换方式,这取决于你为什么需要你的列表。 如果你只需要读取数据。好的,给你:

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

第一种方法实际上不转换数组,但“表示”它像一个列表。但是数组的所有属性都在底层,比如固定数量的元素。请注意,在构造ArrayList时需要指定类型。