List集合与E[]数组互转方法集锦

Posted 孔子-说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List集合与E[]数组互转方法集锦相关的知识,希望对你有一定的参考价值。

原文链接:List集合与数组互转方法集锦

java中,集合和数组都是常用的数据类型,有些工作场景中需要将集合 List<E> 与数组 E[]互转,基于项目的环境或转化后的应用场景,我们可以选择不同的转换方式,本文尽量全面的整理了一些常用的方法,并经过了验证,所有代码均可以拿来直接使用。文中主要以字符串的集合与数组的互转为例,如果换成其他引用类型也是完全可以的。

1、集合List转数组

需要转换的集合对象示例:

List<String> list = new ArrayList<>();
list.add("苹果");
list.add("荣耀");
list.add("OPPO");

1.1 遍历方式

通过遍历操作将List集合中的元素添加到字符数组中,此方式代码量大,不够优雅,建议用其他方式。

public void converArray1(List<String> list) 
   // 遍历操作,代码量大,不优雅
   String[] strArray = new String[list.size()];
   for (int i = 0; i < list.size(); i++) 
       strArray[i] = list.get(i);
   
   for (String s : strArray) 
       System.out.println(s);
   

1.2 toArray()将List转为Object数组

方法说明:Object[] toArray();

public void converArray2(List<String> list) 
   Object[] strArray = list.toArray();
   for (Object s : strArray) 
      System.out.println(s);
   

下例代码编译没有报错,运行报错java.lang.ClassCastException,不能将 Object[] 转化为 String[]

public void converArray21(List<String> list) 
   // 代码编译没有报错,运行报错,不能将Object[]转化为String[]
   String[] strArray = (String[]) list.toArray();
   for (String s : strArray) 
      System.out.println(s);
   

1.3 toArray(T[] a)将List转为T数组

与toArray()不同的是,该方法有了泛型的定义,返回的类型为指定的泛型,不再需要进行类型的强制转换。一般情况下都会使用这个方法。方法说明:<T> T[] toArray(T[] a);

public void converArray3(List<String> list) 
   String[] strArray = list.toArray(new String[list.size()]);
   for (String s : strArray) 
      System.out.println(s);
   

1.4 通过JDK8的Stream流将List转换为Array

通过在Java 8中引入Stream,您可以将List转换为连续的元素流。从集合中获取流作为流对象后,可以调用Stream.toArray()方法,该方法返回包含此流的元素的数组。

public void converArray4(List<String> list) 
   String[] strArray = list.stream().toArray(String[]::new);
   for (String s : strArray) 
      System.out.println(s);
   

1.5 List转为原始Array

当我们调用toArray()方法的时候,得到的是包装数组,比如:Integer[], Double[] 和 Boolean[]。当我需要原始的数组类型的时候呢,列如:int[], double[], boolean[]。

  1. 一种方法是自己进行替换,如下所示:
public int[] convertAsPrimitiveArray(List<Integer> list) 
   int[] ints = new int[list.size()];
   for (int i = 0; i < list.size(); i ++) 
      ints[i] = list.get(i);
   
   return ints;

  1. 第二种方法是使用Java 8 的Stream:
public int[] convertAsPrimitiveArrayWithStream(List<Integer> list) 
   return list.stream().mapToInt(i->i).toArray();

  1. 第三种方法是使用Guava 将List转为 原始Array
public void convertWithGuava(List<Integer> list)
   int[] ints = Ints.toArray(list);
   for(int i: ints) 
      System.out.println(i);
   

2、数组转集合List

需要转换的数组示例:

String[] array = "苹果", "荣耀", "OPPO";

2.1 遍历方式

通过遍历操作将字符数组中的字符串添加到List集合中,此方式代码量大,不够优雅,建议用其他方式。

public void converList1(String[] array) 
   // 循环赋值
   List<String> list = new ArrayList<>();
   for (String s : array) 
      list.add(s);
   
   for (String s : list) 
      System.out.println(s);
   

2.2 Arrays.asList(不支持增删操作)

在此方式中,我们用到了 Arrays.asList(strArray) 方式将数组转换List后,要注意不能对转换后的List增删,只能查改,否则会抛出 UnsupportedOperationException 异常。

  • 原因解析:Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。

  • asList方法返回的是数组的一个视图,视图意味着,对这个list的操作都会反映在原数组上,而且这个list是定长的,不支持add、remove等改变长度的方法。

  • 使用场景:Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。

public void converList2(String[] array) 
   // 注意这个 list 不是Collections包内的List,而是util包里面的List接口
   List<String> list = Arrays.asList(array);
   // 放开下面的注释会报错
   // list.add("xiaomi");
   for (String s : list) 
      System.out.println(s);
   

2.3 ArrayList的构造器(支持增删改查作)

通过ArrayList的构造器,可以将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList转为java.util.ArrayList

  • 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。
public void converList3(String[] array) 
   List<String> list = new ArrayList<>(Arrays.asList(array)) ;
   for (String s : list) 
      System.out.println(s);
   

2.4 通过集合工具类Collections.addAll()方法(最高效)

通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。

  • 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。
public void converList4(String[] array) 
   // Collections.addAll
   List<String> list = new ArrayList<>(array.length);
   Collections.addAll(list, array);
   for (String s : list) 
      System.out.println(s);
   

2.5 通过JDK8的Stream流将字符串数组转为List

public void converList5(String[] array) 
   List<String> list = Arrays.stream(array).collect(Collectors.toList());
   for (String s : list) 
      System.out.println(s);
   

2.6 通过JDK8的Stream流将基本类型数组转为List

如果JDK版本在1.8以上,可以使用流Stream将 int[],long[],double[] 这3种数组快速转为List,不支持 short[ ],byte[ ],char[]

  • 为什么 int[] 不能直接转为List,而 Integer[] 可以转为List呢?这是因为List中的泛型必须是引用类型,而不能是基本类型。
public void converList6() 
   int[] ints = 2, 34, 55, 22, 11;
   long[] longs = 1, 2, 3;
   double[] doubles = 1, 2, 3;
   List<Integer> list1 = Arrays.stream(ints).boxed().collect(Collectors.toList());
   List<Long> list2 = Arrays.stream(longs).boxed().collect(Collectors.toList());
   List<Double> list3 = Arrays.stream(doubles).boxed().collect(Collectors.toList());

   for (Integer s : list1) 
      System.out.println(s);
   
   for (Long s : list2) 
      System.out.println(s);
   
   for (Double s : list3) 
      System.out.println(s);
   

2.7 Guava类库的工具方法

使用guava类库的工具方法将String数组转为列表(集合)。maven项目需要引入如下依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

转换代码

// 使用guava类库的工具方法
public void converList71(String[] array) 
   List<String> list = Lists.newArrayList(array);
   for (String s : list) 
      System.out.println(s);
   

再看下面的代码:

int [] intarray =  1 ,  2 ,  3 ,  4 ,  5 ;
// List<Integer> list = Arrays.asList(intarray);  // 编译通不过
List<int []> list1 = Arrays.asList(intarray);
System.out.println(list1); // 输出:[[I @66d3c617 ]

上述代码第二行编译通不过,第四行虽然可以编译,但输出并不是我们期望的结果,这是因为把int类型的数组当参数了,所以转换后的列表就只包含一个int[]元素的地址。

  • 要想把基本数据类型的数组转化为其包装类型的list,也可以使用guava类库的工具方法。
public void converList7() 
   // 要想把基本数据类型的数组转化为其包装类型的list,可以使用guava类库的工具方法
   int [] intArray =  1 ,  2 ,  3 ,  4 ;
   List<Integer> list1 = Ints.asList(intArray);
   for (Integer s : list1) 
      System.out.println(s);
   

   long[] longArray = 1, 2, 3;
   List<Long> list2 = Longs.asList(longArray);
   for (Long s : list2) 
      System.out.println(s);
   

   double[] doubleArray = 1, 2, 3;
   List<Double> list3 = Doubles.asList(doubleArray);
   for (Double s : list3) 
      System.out.println(s);
   

2.8 Commons Collection

使用Commons Collection将Array 转为 List。CollectionUtils是Commons Collection中的一个类,它为forCollection实例提供实用程序方法和装饰器。 您可以使用CollectionUtils的addAll()方法将数组转换为列表。此方法采用集合和数组的参数,将数组中存在的所有元素添加到集合中。

maven项目需要引入如下依赖:

<dependency>
     <groupId>commons-collections</groupId>
     <artifactId>commons-collections</artifactId>
     <version>3.2.2</version>
</dependency>

示例代码:

public void converList8(String[] array) 
   List<String> list = new ArrayList<>(array.length);
   CollectionUtils.addAll(list, array);
   for (String s : list) 
      System.out.println(s);
   

2.9 使用List.of()

List.of()方法为 Java9新增方法,定义在List接口内,并且为静态方法,故可以由类名直接调用。

List resultList = List.of(array);

以上是关于List集合与E[]数组互转方法集锦的主要内容,如果未能解决你的问题,请参考以下文章

List集合与E[]数组互转方法集锦

集合与数组互转

数组与集合互转

java 集合与数组的互转方法,与源码分析

java集合和数组互转

JAVA集合01_Collection接口概述常用方法集合和数组互转3种遍历方式