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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯鹏飞 黑马帝   /  2011-7-24 21:30  /  2893 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对List集合对象而言可以使用remove方法移出其中的元素,在用Iterator接口时想使用其remove方法删出指定的元素为何无法实现?还有一点困惑的是Iterator有什么用呢,其只有三个方法:hasNext可以用size可替代,next可以用get代替,而其remove还可以不如集合本身的remove功能强大,那其真实作用在哪呢?

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2 好好学习,天天向上!

查看全部评分

4 个回复

倒序浏览
List有自己的迭代器 ListIterator,用这个试试。
Iterator的remove方法移除的是next()最后一次返回的对象。
[ 本帖最后由 那日苏 于 2011-07-24  22:25 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 只给1分

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-25 00:01:26
藤椅
这个接口可以直接用for增强迭待。一般接口功能本身功能没有多强大,而是他的子接口,实现类

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 勉强加一分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-25 17:06:49
板凳
首先写一个Person类:[code=java]package org.cxy.demo;
public class Person {
        private String name;
        private int age;
       
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        public String toString(){
                return "姓名:"+this.name+",年龄:"+this.age;
        }
}[/code]然后要知道,调用List的remove(Object)方法,删除自定义类时,需要为咱们的自定义类重写equals方法。
范例1:看看如下代码。[code=java]package org.cxy.demo;
import java.util.*;
public class Demo {
        public static void main(String[] args) {
                List<Person> list = new ArrayList<Person>();
                list.add(new Person("张三",30));
                System.out.println("删除之前:"+list);
                list.remove(new Person("张三",30));
                System.out.println("删除之后:"+list);
        }
}[/code]但是,由于没有为Person类重写equals方法,而是自动调用的Object类的equals方法,因此,删除失败。
范例2:使用如下代码,可以删除成功。[code=java]package org.cxy.demo;
import java.util.*;
public class Demo {
        public static void main(String[] args) {
                List<Person> list = new ArrayList<Person>();
                Person p = new Person("张三",30);
                list.add(p);
                System.out.println("删除之前:"+list);
                list.remove(p);
                System.out.println("删除之后:"+list);
        }
}[/code]因为Object类的equals方法,源代码:[code=java]    public boolean equals(Object obj) {
        return (this == obj);
    }[/code]因此,您可以为Person重写equals方法,然后执行范例1,就可以删除成功了。
范例3:重写equals。[code=java]package org.cxy.demo;

public class Person {
        private String name;
        private int age;
       
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        @Override
        public boolean equals(Object obj){
                if(this == obj){
                        return true;
                }
                if(!(obj instanceof Person)){
                        return false;
                }
                Person p = (Person)obj;
                if(this.age == p.age && this.name.equals(p.name)){
                        return true;
                }
                return false;
        }
        public String toString(){
                return "姓名:"+this.name+",年龄:"+this.age;
        }
}[/code]

评分

参与人数 1技术分 +3 收起 理由
admin + 3 杰伦每次都是这么的强!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-26 23:14:30
报纸
在Iterator里remove会有一个问题

Iterator 是工作在一个独立的线程中,并且拥有一个mutex锁。
Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生改变时,这个索引表不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照fail-fast原则Iterator会马上抛出java.util.ConcurrentModificationException异常。所以Iterator在工作的时候是不允许被迭代对象改变的。但可以使用Iterator本身的方法remove()来删除对象,Iteraor.remove()方法会在删除当前迭代对象的同时维护索引的一致性。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马