zoukankan      html  css  js  c++  java
  • 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(数组名)

  • 相关阅读:
    machine learning学习笔记
    google detection
    检查ftp备份数据完整性及短信告警的shell脚本
    javascript获取url参数的方法
    php随机生成福彩双色球号码
    php 身份证号码获取星座和生肖
    JS将搜索的关键字高亮显示实现代码
    C#保存上传来的图片示例代码
    window.onresize 多次触发的解决方法
    setTimeout和setInterval的深入理解
  • 原文地址:https://www.cnblogs.com/robbinluobo/p/6515663.html
Copyright © 2011-2022 走看看