首页 文章

在Java中将数组转换为列表

提问于
浏览
807

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

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

例如:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • on 1.4.2返回包含元素1,2,3的列表

  • on 1.5.0返回包含阵列垃圾邮件的列表

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

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

17 回答

  • 8

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

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

    我最近不得不将数组转换为List . 稍后程序过滤了试图删除数据的列表 . 使用Arrays.asList(array)函数时,可以创建固定大小的集合:既不能添加也不能删除 . 此条目比我更好地解释了问题: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(items)操作添加从数组到列表的转换 .

  • 67

    如果您的目标是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> ” .

  • 116

    如果你使用apache commons-lang,另一个解决方法:

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

    ArrayUtils.toObjectint[] 转换为 Integer[]

  • 112

    在Java 8中,您可以使用流:

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

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

    在Effective Java 2nd Ed . ,第7章,第42项中更详细地解释了这个问题 .

  • 1180

    这似乎不太晚,但这是我的两分钱 . 我们不能 List<int> 因为 int 是原始类型所以我们只能 List<Integer> .

    Java 8(int数组)

    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); // Cannot modify returned list
    List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
    List<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));
    

    Why list21 cannot be structurally modified?

    当我们使用 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.copyOf(Arrays.asList(integers))

    • Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

    另请查看我的answer以获取更多信息 .

  • -1

    使用数组

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

    在Java 8中使用Stream 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));
    

    也可以看看:

  • 0

    谈到转换方式,这取决于你为什么需要 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));
    

    第一种方法实际上不转换数组,但'represents'它就像 List . 但是数组在其内部具有所有属性,例如固定数量的元素 . 请注意,在构造 ArrayList 时需要指定类型 .

  • 4

    一内胆:

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

    在Java 9中,您可以通过新的便捷工厂方法List.of获得更加优雅的使用不可变列表的解决方案:

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

    (从here无耻地复制)

  • 2

    更短:

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

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

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

    这按预期工作 .

  • 2

    你必须投射到数组

    Arrays.asList((Object[]) array)
    
  • 2
    • 使用 Guava :
    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
    • 使用Apache Commons集合:
    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);
    
  • 109

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

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

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

相关问题