将数组转换为Java中的列表

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

我使用了Arrays.asList(),但行为(和签名)以某种方式从JavaSE1.4.2(现在存档中的文档)更改为8,并且我在Web上找到的大多数片段都使用1.4.2行为。

例如:

int[] numbers = new int[] { 1, 2, 3 };Arrays.asList(numbers)
  • on 1.4.2返回一个包含元素1、2、3的列表
  • on 1.5.0+返回一个包含数组“number”的列表

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

Assert.assertTrue(Arrays.asList(numbers).indexOf(4) == -1);
1783110 次浏览

问题是varargs是在Java5中引入的,不幸的是,Arrays.asList()也被vararg版本重载了。所以Arrays.asList(numbers)被Java5编译器理解为int数组的vararg参数。

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

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

但是,您可以使用包装int基元的#1类拥有List<Integer>。使用#4实用程序方法将您的数组转换为#3

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

看看这个代码运行在IdeOne.com

你必须把它转换成数组

Arrays.asList((Object[]) array)

我最近不得不将数组转换为列表。后来程序过滤了试图删除数据的列表。当您使用Arrays.as列表(数组)函数时,您创建了一个固定大小的集合:您既不能添加也不能删除。此条目比我更好地解释了问题:为什么当我尝试从列表中删除一个元素时,会得到一个Un的操作异常?

最后,我不得不进行“手动”转换:

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

我想我可以添加转换从一个数组到一个列表使用List.add所有(项目)操作。

说到转换方式,这取决于你为什么需要你的List。如果你需要它只是为了读取数据。好的,在这里:

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时需要指定类型。

在Java8中,您可以使用流:

int[] numbers = new int[] { 1, 2, 3 };Arrays.stream(numbers).boxed().collect(Collectors.toList());

另一个解决方法,如果您使用Apache Commons-lang:

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

其中ArrayUtils.to对象int[]转换为Integer[]

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

Java16

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

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

Java8(整型数组)

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

Java8及以下(整数数组)

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)); // goodList<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

需要ArrayList而不是List吗?

如果我们想要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),但这个列表不能在结构上修改,即不能从列表中添加或删除元素。你也可以查看我的这个回答以获得更多解释。


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

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

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

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

真正不可变列表

Java9:

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

Java10(真正不可变列表):

我们可以使用Java9中引入的List.of。还有其他方法:

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

单行:

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

更短:

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

如果您的目标是Java8(或更高版本),您可以尝试以下操作:

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>”。

使用数组

这是将数组转换为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!

使用ArrayList或其他列表实现

您可以使用for循环将数组的所有元素添加到List实现中,例如ArrayList

List<Integer> list = new ArrayList<>();for (int i : new int[]{1, 2, 3}) {list.add(i);}

在Java8中使用Stream API

您可以将数组转换为流,然后使用不同的收集器收集流:Java8中的默认收集器在屏幕后面使用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));

另见:

如果您在整数值中使用数组,请使用两行代码将数组转换为列表您必须为原始数据类型使用自动装箱类型

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

所以这取决于你正在尝试的Java版本-

Java7

 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 endCollections.addAll(initialList, arr);

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

Java8

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

在Java9中,您可以通过新的便利工厂方法#0使用不可变列表的更优雅的解决方案:

List<String> immutableList = List.of("one","two","three");

(无耻地抄袭这里

  1. 使用番石榴:

    Integer[] array = { 1, 2, 3};List<Integer> list = Lists.newArrayList(sourceArray);
  2. Using Apache Commons Collections:

    Integer[] array = { 1, 2, 3};List<Integer> list = new ArrayList<>(6);CollectionUtils.addAll(list, array);

给定数组:

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

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

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

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

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

注意:使用mapToObj,您可以将每个int元素转换为字符串流、char流等,方法是将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());

你能改进这个答案吗,因为这是我使用的,但我不是100%清楚。它工作正常,但智能J添加了新的WeatherStation[0]。为什么是0?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index){List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));list.remove(index);return list.toArray(new WeatherStation[0]);}

使用它将数组arr转换为列表。Arrays.stream(arr).collect(Collectors.toList());

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

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

从Java8开始,应该做以下事情

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

如果您正在尝试优化内存等(并且不想引入外部库),那么实现自己的不可变“数组视图列表”比您想象的要简单-您只需要扩展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;
@Overridepublic boolean hasNext() {return i < size;}
@Overridepublic Integer next() {return get(i++);}};}
public int size() {return size;}
public Integer get(int i) {return backingArray[i];}}

int是一个基元。基元不能接受null并具有默认值。因此,要接受null,您需要使用包装类Integer

备选案文1:

int[] nos = { 1, 2, 3, 4, 5 };Integer[] nosWrapped = Arrays.stream(nos).boxed()   .toArray(Integer[]::new);nosWrapped[5] = null // can store null

选项2:您可以使用任何使用包装类整数

的数据结构
int[] nos = { 1, 2, 3, 4, 5 };List<Integer> = Arrays.asList(nos)