string[] 和 arraylist互轉及問題解決


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(數組名)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM