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

当前回答

如果使用整数值,则使用两行代码将数组转换为列表 必须对基本数据类型使用自动装箱类型

  Integer [] arr={1,2};
  List<Integer> listInt=Arrays.asList(arr);

其他回答

如果使用整数值,则使用两行代码将数组转换为列表 必须对基本数据类型使用自动装箱类型

  Integer [] arr={1,2};
  List<Integer> listInt=Arrays.asList(arr);

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

我也遇到过同样的问题,写了一个泛型函数,它接受一个数组,并返回一个具有相同内容的相同类型的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的最简单方法。但是,如果您试图从列表中添加新元素或删除现有元素,则会抛出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中使用流API

您可以将数组转换为流,然后使用不同的收集器收集流: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中使用自动装箱和解箱? 什么时候用链表代替数组列表?

你能不能改进这个答案,因为这是我使用的,但我不是100%清楚。它工作正常,但intelliJ增加了新的气象站[0]。为什么是0 ?

公共气象站[]removeElementAtIndex(气象站[]数组,int索引) { List<WeatherStation> List = new ArrayList<WeatherStation>(Arrays.asList(array)); list.remove(指数); 返回列表。toArray(新WeatherStation [0]); }