這篇文章主要討論Stack Overflow上面公選投票最多的一個(gè)問(wèn)題:
如何把下面的數(shù)組轉(zhuǎn)換成為一個(gè)ArrayList?
Element[] array = {new Element(1),new Element(2),new Element(3)};
1. 點(diǎn)贊最多的答案
最受認(rèn)可的答案如下:
ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));
首先,讓我們看一下Java幫助文檔中ArrayList的這種帶參構(gòu)造方法的說(shuō)明
ArrayList(Collection < ? extends E > c) : 構(gòu)造一個(gè)list,用迭代器將指定collection中的元素按順序放入其中。
這個(gè)構(gòu)造方法的實(shí)現(xiàn)過(guò)程:
- 將collection c的元素轉(zhuǎn)換成一個(gè)數(shù)組
- 將這個(gè)數(shù)組復(fù)制給ArrayList的成員變量數(shù)組“elementData”
源代碼:
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;
}
}
2. 點(diǎn)贊第二的答案
排名第二的答案如下:
List<Element> list = Arrays.asList(array);
這不是最佳的答案的原因在于,這個(gè)方法返回的list是固定大小的。事實(shí)上,它返回的并不是java.util.ArrayList,而是java.util.Arrays中一個(gè)私有靜態(tài)的內(nèi)部類。我們知道,ArrayList的實(shí)現(xiàn)原理是數(shù)組,隨著元素增多,數(shù)組會(huì)"擴(kuò)容";而asList()返回的是一個(gè)固定大小的基礎(chǔ)數(shù)據(jù)類型的數(shù)組。如果嘗試添加或者刪除元素,會(huì)拋出UnsupportedOperationException 異常
list.add(new Element(4));
Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at collection.ConvertArray.main(ConvertArray.java:22)
3. 其他答案
Element[] array = {new Element(1), new Element(2)};
List<element> list = new ArrayList<element>(array.length);
Collections.addAll(list, array);
問(wèn)題出自:The stackoverflow question link
4. 譯者補(bǔ)充:?jiǎn)栴}的小補(bǔ)充
不僅是ArrayList,其余List的子類(LinkList,Vector)也可以用同樣的方法實(shí)現(xiàn)數(shù)組和集合轉(zhuǎn)變
Integer[] array=new Integer[]{1,2,3,4,5};
LinkedList<Integer> linkedList=new LinkedList<Integer>(Arrays.asList(array));