import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class TestIterator {
public static void main(String[] args) {
Collection c = new HashSet();//Set是无序的,不可重复的
c.add(new Name("ss", "dd"));
c.add(new Name("bb", "dso"));
c.add(new Name("iisd", "dfg"));
Iterator iterator = c.iterator();//当调用iterator方法时,就将自己的对象返回。至于具体是什么对象不用管,这里运用了多态
while(iterator.hasNext()){//通过返回的对象遍历里面的元素
Name name = (Name)iterator.next();
System.out.println(name.getFirstName());
}
for(Iterator i=c.iterator();i.hasNext();){
Name n = (Name)i.next();
if(n.getFirstName().length()>3){
i.remove();//换成c.remove(name)会产生异常,因为Iterator是同步的,会将当前元素锁住,不允许其他方法访问。
}
}
System.out.println(c);
}
}
Iterator迭代器模式,又叫做游标(Cursor)模式,它提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节,为遍历不同的容器结构提供一个统一的接口(多态迭代)。
迭代器模式给容器的应用带来以下好处:
1) 支持以不同的方式遍历一个容器角色。根据实现方式的不同,效果上会有差别。
2) 简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。
3) 对同一个容器对象,可以同时进行多个遍历。因为遍历状态是保存在每一个迭代器对象中的。
由此也能得出迭代器模式的适用范围:
1) 访问一个容器对象的内容而无需暴露它的内部表示。
2) 支持对容器对象的多种遍历。
3) 为遍历不同的容器结构提供一个统一的接口(多态迭代)。
Name类:
public class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
//当使用contains,removes时,需要在本类中重写equals方法
public boolean equals(Object o){
if(o instanceof Name){
Name name = (Name)o;
return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
}
return super.equals(o);
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
//重写equals应该重写hashCode方法,两对象相互equals他们的hashCode必须相等;
//当一个对象作为索引(Map里的键)时要用hashCode
public int hashCode(){
return firstName.hashCode();
}
public String toString(){
return firstName+","+lastName;
}
}