在Java中将数组转换为列表

时间:2010-04-09 12:20:21

标签: java arrays list containers data-conversion

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

20 个答案:

答案 0 :(得分:1268)

在您的示例中,这是因为您不能拥有基本类型的List。换句话说,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

答案 1 :(得分:129)

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

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

答案 2 :(得分:121)

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

答案 3 :(得分:118)

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

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

答案 4 :(得分:79)

这似乎不太晚,但这是我的两分钱。我们不能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); // 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)的意义上进行修改,但是此列表可能不会在结构上进行修改,即无法在列表中添加或删除元素。您也可以查看question

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

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

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

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

Java 10(Truly Immutable list)有两种方式:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
  3. 另请查看我的answer以获取更多信息。

答案 5 :(得分:8)

我最近不得不将数组转换为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)操作添加从数组到列表的转换。

答案 6 :(得分:7)

更短:

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

答案 7 :(得分:5)

使用数组

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

另见:

答案 8 :(得分: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>”。

答案 9 :(得分:3)

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

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

(从here无耻地复制)

答案 10 :(得分:3)

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

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

ArrayUtils.toObjectint[]转换为Integer[]

的位置

答案 11 :(得分:2)

一衬垫:

for number in result.phoneNumbers {
    guard let numberValue = number.value as? CNPhoneNumber else {
        continue
    }
    print(numberValue)
    print(String(numberValue.stringValue.characters.filter({ !["-", "(", ")"].contains($0) })))
}

答案 12 :(得分:2)

你必须投射到数组

Arrays.asList((Object[]) array)

答案 13 :(得分:2)

  1. 使用番石榴:

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

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

答案 14 :(得分:0)

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

Java 7

 Arrays.asList(1, 2, 3);

OR

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

OR

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/

答案 15 :(得分: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;
}

答案 16 :(得分:0)

给定数组:

    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来转换为字符串流,char流等

    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 :(得分:0)

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

Scanner scan = new Scanner(System.in);
System.out.println("Welcome to the Turn-Based-Battle-System App");

String yes = "y", no = "n";
System.out.println("Do you want to fight? (y/n)");
while (scan.hasNextLine()) {
    String answer = scan.nextLine();
    if (answer.equals(yes)) {
        System.out.println("The game will start now.");
        break;
    } else if (answer.equals(no)) {
        System.out.println("The game will be closed.");
        System.exit(0);
    }
}
// this will only be reached by running out of input or receiving a "y".

答案 18 :(得分:0)

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

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

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

答案 19 :(得分:-1)

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

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