List集合与E[]数组互转方法集锦
Posted 孔子-说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List集合与E[]数组互转方法集锦相关的知识,希望对你有一定的参考价值。
原文链接:List集合与数组互转方法集锦
java中,集合和数组都是常用的数据类型,有些工作场景中需要将集合 List<E>
与数组 E[]
互转,基于项目的环境或转化后的应用场景,我们可以选择不同的转换方式,本文尽量全面的整理了一些常用的方法,并经过了验证,所有代码均可以拿来直接使用。文中主要以字符串的集合与数组的互转为例,如果换成其他引用类型也是完全可以的。
- 集合与字符串互转方法:List集合与逗号分割的String字符串互转方法集锦
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[]。
- 一种方法是自己进行替换,如下所示:
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;
- 第二种方法是使用Java 8 的Stream:
public int[] convertAsPrimitiveArrayWithStream(List<Integer> list)
return list.stream().mapToInt(i->i).toArray();
- 第三种方法是使用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[]数组互转方法集锦的主要内容,如果未能解决你的问题,请参考以下文章