A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭军亮 中级黑马   /  2013-5-29 17:32  /  1462 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code] public static void main(String[] args) {   
  
        ArrayList<String> al = new ArrayList<String>();   
           
        al.add("haha");   
        al.add("abc");   
        al.add("abc");   
        al.add("abc");      
        for(String str:al){
                if("abc".equals(str)){   
                al.remove(str); //为什么这里会报错呢
        }
           
     

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

9 个回复

倒序浏览
我来来编译了下,al 和str 都是应用对象啊,你是要把相同的元素删除的话,E remove(int index) 是表示移除制定位置的元素,楼主传的是一个对象,boolean remove(Object o)  移除此列表中首次出现的指定元素(如果存在)。 这两个方法你最好看下API,传的参数不对。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
貌似与remove的返回类型有关系

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
        方法一:使用迭代器的子接口:ListIterator 列表迭代器
                                系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator
                                没有当前元素;它的光标位置
                                始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。
         
                                Iterator<String> iterator = list.iterator();
                                改为  ListIterator iterator = list.listIterator();

                        方法二:使用集合的实现子类:CopyOnWriteArrayList
                                List list = new ArrayList(); 改为
                                List list = new CopyOnWriteArrayList();

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
小石头39910 发表于 2013-5-29 18:07
貌似与remove的返回类型有关系

美女,你很活跃啊。但是你的回答能不能肯定一点。什么叫貌似。。。
回复 使用道具 举报
本帖最后由 翟宝海 于 2013-5-29 18:50 编辑

在遍历集合过程中,增强for循环可以对集合本身进行增删操作:
因为ArrayList的父类 Abstract  List 里有个modCount的字段记录着List的总数,增强for循环的时候如果增加或者删除了元素(修改不会影响),这个字段会变化,那么在下次for循环的时候检查到跟之前的长度不同,此时会报ConcurrentModificationException异常。
  1. import java.util.*;
  2. class Test
  3. {
  4.         public static void main(String[] args)
  5.         {   
  6.             ArrayList<String> al = new ArrayList<String>();   
  7.             al.add("haha");   
  8.             al.add("abc");   
  9.             al.add("abc");   
  10.             al.add("abc");      
  11.             Iterator it = al.iterator();
  12.             ArrayList<String> al2 =  new ArrayList<String>();
  13.               while(it.hasNext())
  14.         {  
  15.                 Object obj = it.next();
  16.                 if("abc".equals(obj))
  17.                 al2.add((String)obj);
  18.             }
  19.                 System.out.println(al2);
  20.                 al.removeAll(al2);
  21.                 System.out.println(al);         
  22.         }
  23. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
Super_Class 发表于 2013-5-29 18:10
美女,你很活跃啊。但是你的回答能不能肯定一点。什么叫貌似。。。

亲,我木有学高级循环哦,我只是看了一下,不敢妄自菲薄,so,你懂得,菜鸟一枚
回复 使用道具 举报
小石头39910 发表于 2013-5-29 18:13
亲,我木有学高级循环哦,我只是看了一下,不敢妄自菲薄,so,你懂得,菜鸟一枚 ...

对你来说,感觉你学的也不短了。估计高级的foreach 3分钟也就搞定了

谦虚过了就不好了
回复 使用道具 举报
Akm 黑马帝 2013-5-29 18:21:27
9#
  1. http://www.cnblogs.com/frankliiu-java/articles/1759460.html
复制代码
参考相关 帖子 ,你应该就美白了, 自从有了搜索,老师再也不用担心我的学习...
回复 使用道具 举报
迭代的时候,不能删除,建议多看视频
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马