【问题标题】:Converting array to list in Java在Java中将数组转换为列表
【发布时间】:2011-02-06 03:06:22
【问题描述】:

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

我使用了Arrays.asList(),但行为(和签名)不知何故从 Java SE 1.4.2(文档现在存档)更改为 8,我在网上找到的大多数 sn-ps 使用 1.4.2 行为.

例如:

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

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

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

【问题讨论】:

  • 我认为你的例子被打破了:Arrays.asList(new int[] { 1, 2, 3 });绝对没有在 Java 1.4.2 中编译,因为 int[] 不是 Object[]
  • 哦,你可能是对的。在发布之前,我没有 Java 1.4.2 编译器来测试我的示例。现在,在您的评论和乔的回答之后,一切都变得更有意义了。
  • 我认为 Autoboxing 会涵盖从原始到包装 Integer 类的转换。您可以先自己制作演员表,然后上面的Arrays.asList 代码应该可以工作。
  • Java 8 的 Stream.boxed() 将负责自动装箱并可用于此目的。看我的回答below

标签: java arrays list data-conversion


【解决方案1】:

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

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

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

看到这个code run live at IdeOne.com

【讨论】:

  • 或者更简单:Arrays.asList(1, 2, 3);
  • 它怎么知道不创建List&lt;Integer[]&gt;
  • @ThomasAhle 它不创建 List 它创建一个 List 对象。如果你想保证类型安全,你可以写: Arrays.asList(spam);
  • @ThomasAhle 您可以传入 Arrays.asList 0 个或多个元素,采用逗号分隔格式或数组格式,随心所欲。结果将始终相同 - 您指定的元素列表。这是因为方法签名:public static List asList(T... a)。在这里你可以阅读更多关于可变参数docs.oracle.com/javase/tutorial/java/javaOO/…
  • @ThomasAhle 这是个好问题。猜测它只是java编译器中的一条规则。例如,以下代码返回 ListInteger[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List&lt;Integer[]&gt; integerArrays = Arrays.asList(integerArray1, integerArray2);
【解决方案2】:

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

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

【讨论】:

  • 这很好,但不适用于boolean[]。我想那是因为制作Boolean[] 一样容易。这可能是一个更好的解决方案。无论如何,这是一个有趣的怪癖。
  • 在 Java 16 中简化为 Arrays.stream(spam).boxed().toList();
【解决方案3】:

谈到转换方式,这取决于你为什么需要你的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时需要指定类型。

【讨论】:

  • “不变性”让我困惑了一会儿。您显然可以更改数组的值。但是,您无法更改其大小。
【解决方案4】:

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

Java 8(整数数组)

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

需要 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),但是这个列表可能不会在结构上进行修改,即不能从列表中添加或删除元素。您也可以查看我的answer 以获得更多解释。


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

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(真正的不可变列表):

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

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

【讨论】:

  • @BasilBourque 我的意思是不能通过添加/删除来修改列表的结构,但可以更改元素。
  • 确实,我尝试了一些代码并确认调用List::addList::remove 失败,并返回Arrays.asList 的列表。该方法的 JavaDoc 在这一点上写得不好并且不清楚。在我的第三次阅读中,我认为“固定大小”一词的意思是说不能添加或删除元素。
【解决方案5】:

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

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

【讨论】:

  • 我明白发生了什么,但不明白为什么没有记录。我正在寻找一种无需重新实现轮子的替代解决方案。
  • @UsmanIsmail 从 Java 8 开始,我们可以使用流进行这种转换。看我的回答below
【解决方案6】:

我最近不得不将一个数组转换为一个列表。后来程序过滤了试图删除数据的列表。当你使用 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) 操作添加从数组到列表的转换。

【讨论】:

  • new ArrayList&lt;ListItem&gt;(Arrays.asList(itemsArray)) 会一样
  • @BradyZhu:尽管上面的答案并不能解决我的固定大小数组的问题,但你基本上是在说 RTFM,这总是不好的形式。请说明答案有什么问题或不要发表评论。
  • 检查工具可能会在此处显示警告,并且您已说出原因。无需手动复制元素,请改用Collections.addAll(items, itemsArray)
  • 只要碰到这个异常。恐怕Marco13的答案应该是正确的答案。我可能需要通过全年代码来修复所有“asList”异常。
【解决方案7】:

更短:

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

【讨论】:

    【解决方案8】:

    使用数组

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

    另见:

    【讨论】:

      【解决方案9】:

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

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

      (无耻抄袭here

      【讨论】:

      【解决方案10】:

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

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

      ArrayUtils.toObjectint[] 转换为 Integer[]

      【讨论】:

        【解决方案11】:

        单线:

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

        【讨论】:

          【解决方案12】:

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

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

          注意:

          注意Collectors.&lt;Integer&gt;toList(),这个通用方法可以帮助你避免错误“类型不匹配:无法从List&lt;Object&gt;转换为List&lt;Integer&gt;”。

          【讨论】:

            【解决方案13】:

            你必须投进数组

            Arrays.asList((Object[]) array)
            

            【讨论】:

            • java:不兼容的类型:int[] 无法转换为 java.lang.Object[]
            • @dVaffection 然后转换为 int[]。重要的部分是转换为数组。
            【解决方案14】:
            1. 使用番石榴:

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

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

            【讨论】:

              【解决方案15】:

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

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

              【讨论】:

              • 如果没有帮助怎么办?那你做了什么?? ... jk :)
              【解决方案16】:

              给定数组:

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

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

              一种方式:boxed() -> 返回 IntStream

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

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

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

              【讨论】:

                【解决方案17】:

                所以这取决于您尝试使用哪个 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())
                

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

                【讨论】:

                  【解决方案18】:

                  请您改进这个答案,因为这是我使用的,但我不是 100% 清楚。它工作正常,但 intelliJ 添加了新的 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]);
                      }

                  【讨论】:

                  • 为什么要我们改进你的问题?要么你知道答案,要么你不知道。你当然应该提供一个真正帮助他人的答案,而不是一个比帮助更多的混淆的答案。
                  【解决方案19】:

                  从 Java 8 开始,应该做到以下几点

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

                  【讨论】:

                    【解决方案20】:

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

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

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

                    【讨论】:

                      【解决方案21】:

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

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

                      【讨论】:

                      • 这是最简单的方法,应该标记为正确答案。谢谢@yousef
                      猜你喜欢
                      • 1970-01-01
                      • 2014-01-29
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-03-13
                      • 2012-03-23
                      • 1970-01-01
                      • 2018-09-07
                      相关资源
                      最近更新 更多