Java中数组到列表的转换

Converting array to list in Java

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

我使用了EDCOX1(0),但是行为(和签名)从Java SE 1.4.2(文档中现在的文档)变成了8,在Web上发现的大多数片段使用了1.4.2的行为。

例如:

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

在许多情况下,它应该很容易被检测到,但有时它会在不被注意的情况下滑动:

1
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);


在您的示例中,这是因为您不能拥有基元类型的列表。换句话说,List是不可能的。

但是,您可以使用包装int原语的Integer类来拥有List。使用Arrays.asList实用方法将数组转换为List

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

请参阅ideone.com上的"实时运行"代码。


在Java 8中,可以使用流:

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


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

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

但是如果你这样做:

1
list.add(1);

你得到了java.lang.UnsupportedOperationException。因此,在某些情况下,您甚至需要:

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

第一种方法实际上不转换数组,而是像List那样"表示"数组。但数组的所有属性都像固定数目的元素一样,是在其幕后进行的。请注意,在构造ArrayList时需要指定类型。


问题是varargs是在java5中引入的,不幸的是,Arrays.asList()也被vararg版本过载了。因此,java5编译器将Arrays.asList(spam)理解为int数组的vararg参数。

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


似乎有点晚了,但这是我的两分钱。我们不能有List,因为int是原始类型,所以我们只能有List

Java 8(int数组)

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

Java 8及以下(整数数组)

1
2
3
4
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作为:

1
2
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.set(index,element)的意义上修改list21,但是这个列表可能不会在结构上被修改,即不能从列表中添加或删除元素。你也可以检查这个问题。

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

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

另一点需要注意的是,方法Collections.unmodifiableList返回指定列表的不可修改视图。不可修改的视图集合是不可修改的集合,也是支持集合上的视图。请注意,对支持集合的更改可能仍然是可能的,如果发生更改,则可以通过不可修改的视图看到这些更改。

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

Java 10(真正不变的列表)有两种方式:

  • List.copyOf(Arrays.asList(integers))
  • Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
  • 还要查看我的这个答案了解更多信息。


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

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

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

    我想我可以使用list.addall(items)操作添加从数组到列表的转换。


    更短:

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

    使用数组

    这是将数组转换为List的最简单方法。但是,如果您试图添加一个新元素或从列表中删除一个现有元素,那么将抛出一个UnsupportedOperationException

    1
    2
    3
    4
    5
    6
    7
    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

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

    在Java 8中使用流API

    您可以将数组转换为流,然后使用不同的收集器收集流:Java 8中的默认收集器使用EDOCX1 OR 4在屏幕后面,但也可以强行添加首选项实现。

    1
    2
    3
    4
    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中使用自动装箱和解包?
    • 何时在ArrayList上使用LinkedList?

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

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

    注:

    注意Collectors.toList(),这个通用方法有助于避免错误"类型不匹配:不能从List转换为List"。


    如果使用ApacheCommonsLang,另一个解决方法是:

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

    其中arrayutils.toobject将int[]转换为Integer[]


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

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

    (无耻地从这里抄袭)


  • 番石榴:

    1
    2
    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
  • 使用Apache Commons集合:

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

  • 你必须加入到数组中

    1
    Arrays.asList((Object[]) array)


    一班轮:

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

    所以这取决于你尝试的Java版本。

    爪哇7

    1
     Arrays.asList(1, 2, 3);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
           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);

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

    在Java 8中

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

    参考-http://www.codingek.com/java/how-to-convert-array-to-list-in-java/


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

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


    如果在整数值中使用数组,请使用两行代码将其转换为列表必须对基元数据类型使用Autoboxing类型

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