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

才疏学浅,如文中有错误,感谢大家指出。 

posted @ 2019-09-14 23:03  runningRookie  阅读(151)  评论(0编辑  收藏  举报