1,String 數組轉成 list<String>
String[] s={"1","2","3","5","6"};
List<String> listA = Arrays.asList(s);
String 數組在轉成 list<String>后, 直接對該list進行操作, 會出異常,例如:
public static void main(String[] args) { String[] s={"1","2","3","5","6"}; List<String> listA = Arrays.asList(s); listA.add(3,"4"); for(String temp:listA){ System.out.println(temp); } }
運行時會拋出如下異常:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
原因分析:
在使用Arrays.asList()后調用add,remove這些method時出現java.lang.UnsupportedOperationException異常。這是由於Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是繼承AbstractList,remove,add等 method在AbstractList中是默認throw UnsupportedOperationException而且不作任何操作。ArrayList override這些method來對list進行操作,但是Arrays$ArrayList沒有override remove(),add()等,所以throw UnsupportedOperationException。
解決方法:
轉換為ArrayList,例如上面代碼改成如下:
public static void main(String[] args) { String[] s={"1","2","3","5","6"}; List<String> listA = Arrays.asList(s); List<String> listB = new ArrayList<String>(listA); listB.add(3,"4"); for(String temp:listB){ System.out.println(temp); } }
運行結果:輸出 1 2 3 4 5 6
PS: 這里順便說明一下arraylist 的 remove() add() 特點
1)arraylist add時, 指定了index添加時,原本該index上的位置不會被刪除, 而是從index位置上的數據都向右移。
2)arraylist delete時, 刪除后, 該位置后面的所有數據自動向左移,所以遍歷的時候, index需要-1 才不會漏掉, 或者直接從倒序遍歷,
例如如下代碼:
public static void main(String[] args) { String[] s={"1","2","2","3","5","6"}; List<String> listA = Arrays.asList(s); List<String> listB = new ArrayList<String>(listA); for(int i=0;i<listB.size();i++){ if (listB.get(i).equals("2")){ listB.remove(i); } } for(String temp:listB){ System.out.println(temp); } }
運行結果:輸出 1 2 3 4 5 6 , 該原list index=2位置漏掉遍歷,所以得到結果不符合預期
改成如下:
public static void main(String[] args) { String[] s={"1","2","2","3","5","6"}; List<String> listA = Arrays.asList(s); List<String> listB = new ArrayList<String>(listA); //1. Should reduce 1 once remove for(int i=1;i<listB.size();i++){ if (listB.get(i).equals("2")){ listB.remove(i); i--; } } /** * 2. reverse traversal for(int i=listB.size()-1;i>=0;i--){ if (listB.get(i).equals("2")){ listB.remove(i); } }**/ for(String temp:listB){ System.out.println(temp); } }
運行結果:輸出 1 3 4 5 6
2, list<String>轉成String 數組
String[] b = list.toArray(new String[list.size()]);
3,String數組直接轉成string輸出
Arrays.toString(數組名)