说明
平常经常会用到数组、list的相互转换,但一直没有认证研究,尤其为什么Arrays.asList返回的list不能增加、删除元素,今天彻底搞懂了。
数组转list
Arrays.asList(T… a)
数组转list,使用Arrays.asList(T… a)方法
//数组转list
String[] players={
"kobe","t-mac","cp3"};
//Arrays.asList返回的list是固定大小的,不能add、remove操作
List<String> noList = Arrays.asList(players);
注意,Arrays.asLit()返回的list是固定大小的,不能执行增加、删除操作。所以通常的做法是
List<String> yesList= new ArrayList<String>(Arrays.asList(players));
Arrays.asList返回的list为什么不能增加、删除元素?
查看源码
Arrays.java
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这里用到了ArrayList,不可思议了,因为Arraylist是可以增加、删除元素的呀!为什么这里却不能?继续查看源码发现这里的ArrayList原来是Arrays的内部类ArrayList,而不是java.util.ArrayList。
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
}
Arrays$ArrayList继承自AbstractList,AbstractList的add、remove方法都抛出异常,所以不能增加、删除元素。另外,构造方法中a=array,说明,数组转换出来的list与数组,指向同一块内存。
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
list转数组
list.toArray(T[] a)
//list转数组
List<String> list2 = new ArrayList<String>();
list2.add("kobe");
list2.add("t-mac");
list2.add("cp3");
String[] arr2 = list2.toArray(new String[list2.size()]);
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20283.html