string[] 和 arraylist互轉(zhuǎn)及問題解決

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ù)組名)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容