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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Conning 中级黑马   /  2014-5-28 22:20  /  2125 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1.         List list = new ArrayList();
  2.                 list.add('a');
  3.                 list.add('b');
  4.                 list.add('c');
  5.                 list.add('d');
  6.                 // 普通for循环删除
  7.                 for (int i = 0; i < list.size(); i++) {
  8.                         Object object2 = list.get(i);
  9.                         if (object2.equals('a')) {
  10.                                 list.remove(i--);               
  11.                         }
  12.                 }
  13.                 // 迭代器删除
  14.                 Iterator iterator = list.iterator();
  15.                 while (iterator.hasNext()) {

  16.                         Object object = iterator.next();
  17.                         // 判断是否等于
  18.                         if (object.equals('b')) {
  19.                                 // remove方法
  20.                                 // list.remove(); 报错
  21.                                 iterator.remove();
  22.                         }
  23.                 }
  24.                 System.out.println(list);
  25.         }
  26. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

7 个回复

倒序浏览
我的疑问是经过普通For循环遍历删除用List子类对象调用remove方法可以
但是为什么用迭代删除的时候不可以用List子类对象调用remove方法 只能用迭代器的对象iterator调用remove方法
回复 使用道具 举报
List的remove方法后面必须加参数啊。而且直接用List的remove方法会报同时修改异常(ConcurrentModificationException)。
回复 使用道具 举报
你下面的object是通过iterator的方法返回的,那只能通过iterator.remove()删除,你的list.remove()应该删除的是list返回的object。
回复 使用道具 举报
wangleixhlm 发表于 2014-5-28 22:44
List的remove方法后面必须加参数啊。而且直接用List的remove方法会报同时修改异常(ConcurrentModificationE ...

查了下API 确实List的remove是有参数的
//void remove(int position)
//从此滚动列表中移除指定位置处的项。
同时修改异常老师提到过 但是好像不是这里 我再复习复习视频吧 谢了哥们
回复 使用道具 举报
路过~~~~
回复 使用道具 举报
感觉着问题很2啊........你直接看帮助文档中的List对象啊,里面哪来的无参remove()方法啊?
C:\Users\JSON\Desktop\QQ图片20140528233440.jpg
回复 使用道具 举报
同学,前几天就有人提过这个问题,我把以前的回答给你贴到这里吧.
这个是信息同步的问题啦,同学。
1. 迭代器的问题,咱们看看jdk1.6 api怎么描述的吧
public ListIterator<E> listIterator(int index)
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。指定的索引表示 next 的初始调用所返回的第一个元素。previous 方法的初始调用将返回索引比指定索引少 1 的元素。
此实现返回 ListIterator 接口的直接实现,扩展了由 iterator() 方法返回的 Iterator 接口的实现。ListIterator 实现依赖于底层实现列表的 get(int)、set(int, E)、add(int, E) 和 remove(int) 方法。
注意,除非重写列表的 remove(int)、set(int, E) 和 add(int, E) 方法,否则此实现返回的列表迭代器将抛出 UnsupportedOperationException 来响应其 remove、set 和 add 方法。

根据 (protected) modCount 字段规范中的描述,在面临并发修改时,可以使此实现抛出运行时异常。


个人的见解:其实说白了,就是ArrayList内部实现了一个ListIterator接口的一个类,就是说我调用这个方法,就是把ArrayList中所有信息传递给这个子类。
2. 理解了这个之后呢,我们再说为什么使用ListIterator接口可以,使用ArrayList的方法却不行。
其实是迭代器的实现的问题。
一个一个说。
2.1假如说我们使用ArrayList的删除或者增加方法,在此之前呢,我们的ArrayList的数据已经给了ArrayList内部实现了一个ListIterator接口的类,调用这些方法呢,ArrayList内部没有实现通知的机制,即不会去通知已经生成的实现ListIterator接口的类,原因是这样的,假如说实现了通知机制,这是存在问题的,原因如下:
   我们知道是、,使用ArrayList是可以删除ArrayList存在的任何元素的,假如我们删除的是在迭代器中已经便利过的,那么即使我们通知迭代器也是无济于事的,因为都已经迭代完了,所以数据时存在问题的。
2.2 为什么我们使用接口的方法就没问题的,因为实现ListIterator接口的类呢,实现了通知的机制,那么你可能会问,这个就不会出现这个问题呢,答案是不会的,我们看看迭代器的api说明,
2.2.1
    public void remove()从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。对于每个 next 或 previous 调用,只能执行一次此调用。只有在最后一次调用 next 或 previous 之后,尚未调用 ListIterator.add 时才可以执行该调用。
2.2.2
void add(E e)将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素(此调用把调用 nextIndex 或 previousIndex 所返回的值增加 1)。
add方法本来就是就最后增加元素,所以不可能存在问题。
remove方法操作的都是当前元素(这就是指针的问题啦,对于我们使用的previous,next,iterator都会指向我们的结果),没有涉及到已经遍历的元素,所以是可行的。
以下是小小的一个案例,楼主可以先考虑考虑执行的结果是什么?这个是比较有意思的一道题目,我自己写的,希望能够帮到你.

public class ArrayListTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                ArrayList<String> list = new ArrayList<String>();
                list.add("str1");
                list.add("str2");
                list.add("str3");
                list.add("str4");
                list.add("str5");
                for(ListIterator iterator=list.listIterator();iterator.hasNext();){
                        System.out.println("for each start");
                        if(iterator.hasPrevious()){
                                System.out.println("enter if condition");
                                System.out.println(iterator.previous());
                        }
                }
                System.out.println("over");
        }

}
帖子地址:http://bbs.itheima.com/thread-118403-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马