Array与ArrayList的转换
创建数组和List
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
String[] arr = {"3","4"};
ArrayList转Array
这没什么好说的,就是:
// array转arraylist
String[] listToArr = list.toArray(new String[0]);
Array转ArrayList(有坑)
最常见的方法(不能增加或删除元素):
// arraylist转array
List<String> arrToList = Arrays.asList(arr);
但这个方法有几个问题:
- 生成的list是固定大小的,增加或删除元素会有一个runtime error: UnsupportedOperationException. 如果有增删的需求
- 原数组与新生成的List是关联的。修改原数组或list中的元素,另一个中的元素也会被修改。
如果需要修改list大小,应该像下面这样再套一层。
// arraylist转array
List<String> arrToList = Arrays.asList(arr);
原因
通过Arrays.asList()生成的ArrayList其实是在Arrays类里定义的内部类,这个内部类继承了AbstractList,这个内部类实现了一部分Collection中的一部分方法,但是没有实现任何会修改list大小的方法。
这个内部类中值储存在一个final修饰的数组中,所以也不可能再指向其他size的数组了
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
}