科帮网-Java论坛、Java社区、JavaWeb毕业设计

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > java中如何删除一个list列表中的元素
总共48086条微博

动态微博

查看: 1829|回复: 0

java中如何删除一个list列表中的元素

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-08-13 13:18:10 |只看该作者 |倒序浏览
    思考下面这一段在循环中删除多个元素的的代码:

    1. ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
    2. for(int i=0;i<list.size();i++){   
    3. list.remove(i);
    4. }
    5. System.out.println(list);
    复制代码
    输出结果是:
    1. [b,d]
    复制代码

    在这个方法中有一个严重的错误。当一个元素被删除时,列表的大小缩小并且下标变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。你也许知道在循环中正确的删除多个元素的方法是使用迭代,并且你知道java中的foreach循环看起来像一个迭代器,但实际上并不是。考虑一下下面的代码:
    1. ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
    2. for(String s:list){   
    3. if(s.equals("a")){      
    4. list.remove(s);   
    5. }}
    复制代码
    它会抛出一个ConcurrentModificationException异常。
    相反下面的显示正常:
    1. ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
    2. Iterator<String> iter = list.iterator();
    3. while(iter.hasNext()){      
    4. String s = iter.next();        
    5. if(s.equals("a")){           
    6. iter.remove();   
    7. }}
    复制代码
    .next()必须在.remove()之前调用。在一个foreach循环中,编译器会使.next()在删除元素之后被调用,因此就会抛出ConcurrentModificationException异常,你也许希望看一下ArrayList.iterator()的源代码




    科帮网-Java论坛、Java社区、JavaWeb毕业设计 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网-Java论坛、Java社区、JavaWeb毕业设计享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网-Java论坛、Java社区、JavaWeb毕业设计的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网-Java论坛、Java社区、JavaWeb毕业设计管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表