先看一下相关的结果或函数。
①ArrayList.subList是ArrayList的一个内部类,不可以强转成成ArrayList,否则会抛出ClassCastException异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList,是ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
②Arrays.asList返回的是一个 Arrays 内部类,是固定大小的一个list,使用相关的add、remove、clear等方法会产生UnsupportedOperationException异常。
③ArrayList.toArray返回的是Object[],而ArrayList.toArray(T[] a)返回的是一个传入参数一样大小和类型的数组。
1.数组转List
①直接是用Arrays.asList肯定是错误,转成的List不能操作
②ArrayList arrayList = new ArrayList(Arrays.asList(array));
使用这种方法,除了asList中的创建list,还会将List转数组再复制到ArrayList的数组中,因为多了两次的操作,所以这种方法效率低。
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
③创建一个空的ArrayList,循环把数组的元素add进去,这样子只是直接加到list中,没有把其他多余操作,这是我们自己实现的代码。
Element[] elements = new Element[10];
List<Element> list = new ArrayList<>(elements.length);
for(Element element:elements){
list.add(element);
}
其实Collections中已经帮我们实现了代码,很简洁,很漂亮的代码。
@SafeVarargs
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
在ArrayList的源码中,add(E e)方法只会返回true,所以对于ArrayList来说result只会是true。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
至于ArrayList转数组,阿里巴巴Java开发规范中有详细的解释。