黑马程序员技术交流社区
标题:
remove方法的困惑
[打印本页]
作者:
冯鹏飞
时间:
2011-7-24 21:30
标题:
remove方法的困惑
对List集合对象而言可以使用remove方法移出其中的元素,在用Iterator接口时想使用其remove方法删出指定的元素为何无法实现?还有一点困惑的是Iterator有什么用呢,其只有三个方法:hasNext可以用size可替代,next可以用get代替,而其remove还可以不如集合本身的remove功能强大,那其真实作用在哪呢?
作者:
那日苏
时间:
2011-7-24 21:48
List有自己的迭代器 ListIterator,用这个试试。
Iterator的remove方法移除的是next()最后一次返回的对象。
[
本帖最后由 那日苏 于 2011-07-24 22:25 编辑
]
作者:
匿名
时间:
2011-7-25 00:01
这个接口可以直接用for增强迭待。一般接口功能本身功能没有多强大,而是他的子接口,实现类
作者:
匿名
时间:
2011-7-25 17:06
首先写一个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]
作者:
匿名
时间:
2011-7-26 23:14
在Iterator里remove会有一个问题
Iterator 是工作在一个独立的线程中,并且拥有一个mutex锁。
Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生改变时,这个索引表不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照fail-fast原则Iterator会马上抛出java.util.ConcurrentModificationException异常。所以Iterator在工作的时候是不允许被迭代对象改变的。但可以使用Iterator本身的方法remove()来删除对象,Iteraor.remove()方法会在删除当前迭代对象的同时维护索引的一致性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2