string[] 和 arraylist互轉(zhuǎn)及問題解決
1,String 數(shù)組轉(zhuǎn)成 list<String>
String[] s={"1","2","3","5","6"};
List<String> listA = Arrays.asList(s);
String 數(shù)組在轉(zhuǎn)成 list<String>后, 直接對該list進(jìn)行操作, 會出異常,例如:
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);
}
}
運(yùn)行時會拋出如下異常:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
原因分析:
在使用Arrays.asList()后調(diào)用add,remove這些method時出現(xiàn)java.lang.UnsupportedOperationException異常。這是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是繼承AbstractList,remove,add等 method在AbstractList中是默認(rèn)throw UnsupportedOperationException而且不作任何操作。ArrayList override這些method來對list進(jìn)行操作,但是Arrays$ArrayList沒有override remove(),add()等,所以throw UnsupportedOperationException。
解決方法:
轉(zhuǎn)換為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);
}
}
運(yùn)行結(jié)果:輸出 1 2 3 4 5 6
PS: 這里順便說明一下arraylist 的 remove() add() 特點(diǎn)
1)arraylist add時, 指定了index添加時,原本該index上的位置不會被刪除, 而是從index位置上的數(shù)據(jù)都向右移。
2)arraylist delete時, 刪除后, 該位置后面的所有數(shù)據(jù)自動向左移,所以遍歷的時候, 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);
}
}
運(yùn)行結(jié)果:輸出 1 2 3 4 5 6 , 該原list index=2位置漏掉遍歷,所以得到結(jié)果不符合預(yù)期
改成如下:
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);
}
}
運(yùn)行結(jié)果:輸出 1 3 4 5 6
2, list<String>轉(zhuǎn)成String 數(shù)組
String[] b = list.toArray(new String[list.size()]);
3,String數(shù)組直接轉(zhuǎn)成string輸出
Arrays.toString(數(shù)組名)