转换数组列出的Java

问题描述 投票:867回答:17

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

我用了Arrays.asList()但行为(和签名)从Java SE 1.4.2(文档现在档案)以某种方式改变为8,我发现在网络上最段都使用1.4.2行为。

例如:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 上1.4.2返回包含元件1,2,3的列表
  • 上1.5.0+返回包含该阵列的垃圾邮件列表

在许多情况下,它应该很容易察觉,但有时它可以滑被忽视:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
java arrays list containers data-conversion
17个回答
1328
投票

在你的榜样,那是因为你不能有一个原始类型的列表。换句话说,List<int>是不可能的。

你可以,但是,必须使用包裹List<Integer>原始的Integerint。将您的阵列与List实用方法Arrays.asList

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

看到这个code run live at IdeOne.com


3
投票

在Java中9,你必须通过新的便利工厂方法List.of使用不可变列表的更优雅的解决方案:

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

(无耻地从here复制)


3
投票

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

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


2
投票

你必须投以阵列

Arrays.asList((Object[]) array)

2
投票

一内胆:

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

2
投票
  1. 使用番石榴: Integer[] array = { 1, 2, 3}; List<Integer> list = Lists.newArrayList(sourceArray);
  2. 使用Apache共享类别: Integer[] array = { 1, 2, 3}; List<Integer> list = new ArrayList<>(6); CollectionUtils.addAll(list, array);

0
投票

所以,这取决于它的Java版本你trying-

Java 7中

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

要么

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

在Java 8

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/


0
投票

如果这可以帮助:我有同样的问题,只是写了一个通用的函数,它接受一个数组,并返回相同类型,具有相同内容的ArrayList:

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

0
投票

定的数组:

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

转换整数数组为整数列表

方式一:盒装() - >返回IntStream

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

方式二:流中的每个元素映射到整数,然后收集

注意:使用mapToObj可以通过壳体i到(char)的隐蔽各INT元件成字符串流,焦炭流等我

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

-1
投票

使用两个代码行,如果你使用它的整数值,你必须使用自动装箱类型原始数据类型转换数组列表

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

139
投票

在Java 8中,可以使用流:

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

128
投票

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

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


119
投票

问题是,可变参数得到了在Java5的介绍,不幸的是,Arrays.asList()得到了可变参数版本超载了。所以Arrays.asList(spam)由Java5的编译器为INT阵列的可变参数参数的理解。

这个问题在有效的Java第二版,第7章,第42项更多的细节解释。


88
投票

这似乎有点晚,但这里有我的两分钱。我们不能有List<int>作为int是基本类型,所以我们只能有List<Integer>

爪哇8(int数组)

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

爪哇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

需要ArrayList和未列出?

如果我们希望有一个具体的实施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)意义上被修改,但这份名单可能不被结构修饰,即不能添加或删除列表中的元素。您还可以检查此question


如果我们希望有一个不变的名单,然后我们就可以把它包装成:

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

要注意的另一点是,该方法Collections.unmodifiableList返回指定列表的修改视图。不可修改视图集合是集合,是不可修改的,并且也是图到背衬集合。请注意,变更为后盾收集可能仍然是可能的,如果它们发生,他们是通过修改视图可见。

我们可以在Java中10真正的不可变列表。

Java的10有两种方式(真正的不可变List):

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

还要检查我的这个answer更多。


8
投票

我最近有一个数组转换到一个列表。后来节目筛选列表试图删除这些数据。当您使用Arrays.asList(阵列)功能,您可以创建一个固定大小的集合:你既不能增加也不能删除。该条目解释这个问题比我可以更好地:Why do I get an UnsupportedOperationException when trying to remove an element from a List?

最后,我不得不做“手册”的转换:

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

我想我可以添加转换从阵列到使用List.addAll(项目)的操作的列表。


8
投票

更短:

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

5
投票

Using Arrays

这是转换一个数组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!

Using ArrayList or Other List Implementations

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

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

Using Stream API in Java 8

你可以把数组转换成流,然后收集使用不同的收藏家流:在屏幕后面的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));

也可以看看:


3
投票

另一个解决办法,如果你使用Apache公地郎咸平:

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

ArrayUtils.toObject转换int[]Integer[]

© www.soinside.com 2019 - 2024. All rights reserved.