java数组转换为集合-Arrays.asList使用
在日常开发中,经常遇到需要将动态增加数组数据的情况,但是java中的数组的定义如下:
Java语言中提供的数组是用来存储固定大小的同类型元素。(菜鸟教程)
也就是说,数组在声明时就是固定长度,不可增加或者减少它的长度的。那么当我们的确需要动态修改长度应该如何去处理,这时候就应该用到List集合了。 将数组转换为集合有以下两种方式
1. 声明一个List集合,遍历数组,将数组中的每一个元素添加到List集合中
import java.util.ArrayList;
import java.util.List;
public class ArraysDemo {
public static void main(String[] args) {
String[] strArray = {"a","b"};
List<String> strList = new ArrayList<>(strArray.length);
for (String str : strArray) {
strList.add(str);
}
strList.add("c");
strList.add("d");
for (String str : strList) {
System.out.println(str);
}
}
}
2. 使用java提供的类Arrays.asList方法,可以将数组转换为集合
public class ArraysDemo {
public static void main(String[] args) {
String[] strArray = {"a","b"};
List<String> asList = Arrays.asList(strArray);
// 此处会报异常
asList.add("e");
for (String str : asList) {
System.out.println(str);
}
}
}
但是当我们转换了之后,需要动态修改这个集合时就发现问题了。
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at testProject.ArraysDemo.main(ArraysDemo.java:11)
在此我们查看一下Arrays.asList(T... a)的源码,可以发现这个方法返回的类是这个java.util.Arrays.ArrayList.ArrayList<T>,是Arrays下的内部类,而不是java.util.ArrayList,它继承了AbstractList但是并没有实现像ArrayList中的添加和删除方法,当调用add方法时会抛出异常UnsupportedOperationException()。
// asList方法的函数体
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
// 当前的ArrayList是Arrays下的私有内部类
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
// 省略类的实现代码...
}
解决方法
我们可以将这个转换后的集合作为参数传给声明的List中 这时候就可以使用List中的添加和删除方法了。
public class ArraysDemo {
public static void main(String[] args) {
String[] strArray = {"a","b"};
List<String> asList = new ArrayList<>(Arrays.asList(strArray));
asList.add("e");
for (String str : asList) {
System.out.println(str);
}
}
}
才疏学浅,如文中有错误,感谢大家指出。