Array.asList:陣列轉list時你一定要知道的“陷阱”!
阿新 • • 發佈:2018-11-27
最近開發中,業務上處理,經常用到asList方法,這讓我不經想起了它的很多容易讓人犯錯的地方或者誤解的地方,所以就想抽出時間來,整理一下,和大家分享出來,深夜了,話不多說,主要以程式碼為主,簡易的程式碼,你一看就知道了!
大家都知道這個方法是將陣列轉成list,是JDK中java.util包中Arrays類的靜態方法。大家使用時一定要注意(請看程式碼和註釋,一看就明瞭了):
String s[]={"aa","bb","cc"}; List<String> sList=Arrays.asList(s); for(String str:sList){//能遍歷出各個元素 System.out.println(str); } System.out.println(sList.size());//為3 System.out.println("- - - - - - - - - - -"); int i[]={11,22,33}; List intList=Arrays.asList(i); //intList中就有一個Integer陣列型別的物件,整個陣列作為一個元素存進去的 for(Object o:intList){//就一個元素 System.out.println(o.toString()); } System.out.println("- - - - - - - - - - -"); Integer ob[]={11,22,33}; List<Integer> objList=Arrays.asList(ob); //數組裡的每一個元素都是作為list中的一個元素 for(int a:objList){ System.out.println(a); } System.out.println("- - - - - - - - - - -"); //objList.remove(0);//asList()返回的是arrays中私有的終極ArrayList型別,它有set,get,contains方法,但沒有增加和刪除元素的方法,所以大小固定,會報錯 //objList.add(0);//由於asList返回的list的實現類中無add方法,所以會報錯
輸入結果:
aa
bb
cc
3
- - - - - - - - - - -
[[email protected]
- - - - - - - - - - -
11
22
33
- - - - - - - - - - -
如果你想直接根據基本型別的陣列如int[],long[]直接用asList轉成list,那麼我們可以選擇用apache commons-lang工具包裡的陣列工具類ArrayUtils類的toObject()方法,非常方便,如下:
//上邊的程式碼:int i[]={11,22,33};,達到了我們想要的效果 Arrays.asList(ArrayUtils.toObject(i));
//objList.remove(0);//asList()返回的是arrays中私有的終極ArrayList型別,它有set,get,contains方法,但沒有增加和刪除元素的方法,所以大小固定,會報錯
//objList.add(0);//由於asList返回的list的實現類中無add方法,所以會報錯
之所以有以上原因,看看asList的原始碼就明白了:
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
private final E[] a; ArrayList(E[] array) { if (array==null) throw new NullPointerException(); a = array; }
如果想根據陣列得到一個新的正常的list,當然可可以迴圈一個一個新增,也可以才有以下2個種方法:
//這樣就是得到一個新的list,可對其進行add,remove了
ArrayList<Integer> copyArrays=new ArrayList<Integer>(Arrays.asList(ob));
copyArrays.add(222);//正常,不會報錯
//或者新建一個空的list,把要轉換的 陣列用Collections.addAll新增進去
Collections.addAll(new ArrayList<Integer>(5), ob);
這個類功能很強大:
還能“逆向”轉過來,具體就不說了。
來源於: