1. 程式人生 > >Array.asList:陣列轉list時你一定要知道的“陷阱”!

Array.asList:陣列轉list時你一定要知道的“陷阱”!

最近開發中,業務上處理,經常用到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);

這個類功能很強大:

還能“逆向”轉過來,具體就不說了。

 


來源於:

 java版web專案

https://blog.csdn.net/chenleixing/article/details/43775127