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循环