Iterator 接口

这也是一个非常有用的接口,几乎可以这么说吧,在实际应用中只要用到啦Collection接口的类都会用到iterator
这个接口,然而所有实现啦Collection接口的容器类都有一个iterator()方法,用来返回一个实现啦Iterator接口
的对象。它的作用就是对Collection的元素进行遍历操作(即把Collection中的元素按你自己想要的方式取出来).

而这个接口中定义啦这三个方法。
boolean hasNext(); //判断游标右边是否还有元素
Object next(); //返回上面的游标中指定的元素,再把游标移动到下一个位置,当然,取出来的东西要转换为适合的类型
void remove(); //删除游标左面的元素,在执行完next之后该操作只能执行一次

下面看一个小例子:
注意一下写有1的那个地方
例一
源代码:

import java.util.*;
public class   TestIterator
{
public static void main(String[] args)
{
   //Collection c=new LinkedList();   //4
   Collection c=new HashSet();        //5
   c.add(new User("first","fN"));
   c.add(new User("second","sN"));
   c.add(new User("third","tN"));
   c.add(new User("four","fourN"));
   c.add(new User("four","fourN"));//注意这行与上面一行是相同的 1


   Iterator it=c.iterator(); //6  
   while(it.hasNext())
   {
    //这里要强制转换相应的类型 因为next()返回的是Object的类型
    User user=(User)it.next();
    System.out.println("FirstName :" +user.firstName+"    LastName: "+user.lastName);
   }     //7
}
}
class User
{
public String firstName;
public String lastName;

public User(String firstName,String lastName)
{
   this.firstName=firstName;
   this.lastName=lastName;
}
public   String toString()
{
   return firstName+" "+lastName;
}
}

结果:
FirstName :third    LastName: tN
FirstName :second    LastName: sN
FirstName :four    LastName: fourN   //   2
FirstName :first    LastName: fN
FirstName :four    LastName: fourN   //   3

看看这结果。与我们想的有点不一样吧,还记得前面我们说过Set的是没有顺序的。并且不重复的
那为什么我这们这里的 2 和 3这个地方是重复的呢,那是因为它的引用的地址是不一样的
两个对象没有equals,这下应该明白是什么意思啦吧, 你可以把4的注释去掉,再在5上注释,
你就会发现它们的结果是有顺序的啦.但是这个例子重要的地方还是6-7那一部分代码,我们现在主要
说的是Iterator,看到这结果你应该知道它有什么用啦吧,我就不必多说啦

例二.
在这个例子中用Iterator中的 remove()方法去掉它当中的某些元素,当firstName的长度小于6位时就去掉
先看例子再说。要不然蒙蒙的.User这个类和上面的一样就不再写啦

import java.util.*;
public class   TestIterator
{
public static void main(String[] args)
{
   Collection c=new LinkedList();
   //Collection c=new HashSet();
   c.add(new User("first","fN"));
   c.add(new User("second","sN"));
   c.add(new User("third","tN"));
   c.add(new User("four","fourN"));
   c.add(new User("four","fourN"));//注意这行与上面一行是相同的
  
   for(Iterator it=c.iterator();it.hasNext();)
   {
    User user=(User)it.next();
    if(user.firstName.length()<6)
    {
     it.remove();
     //c.remove(user); //注释 1
    }
   }
   System.out.println(c);
}
}

结果:
[second sN]

注意 注释 1那个地方,在这Iterator的内部是不能用Collection中的remove()方法的因为迭代器在这当中
进行啦自动加锁的功能,所以是不能用的,如果用的会编译的时候不会报错,但是在执行的时候就会抛出
异常,你可以尝试一下

例三.
在这里我们简单的谈一上增强的for循环。
先看例子和结果再细说

源代码如下

import java.util.*;
public class TestEnhancedFor  
{
public static void main(String[] args)
{
   int [] arr={1,2,3,4};
   for(int i:arr)
   {
    System.out.println(i);
   }
   Collection c=new ArrayList();
  
   c.add(new String("aaaa"));
   c.add(new String("bbbb"));
   c.add(new String("cccc"));

   for(Object o:c)
   {
    System.out.println(o);
   }
  
}
}
结果:
1
2
3
4
aaaa
bbbb
cccc

增强for循环的缺陷
   对于数组来说---不能方便的访问下标值
   对于集合来说------与使用Iterator相比,不能方便的删除集合中的内容,其实在它的内部也是调用Iterator
总结: 除啦简单遍历并读出其中的内容外,那些有开发经验的人不推介使用增强for循环

posted on 2007-09-27 15:53  李小鱼  阅读(203)  评论(0编辑  收藏  举报