前面我们已经学会了集合的基本操作,还记得最后我们讲的那个遍历集合的例子吗?首先向集合中添加元素,再把集合转换成数组,利用数组的length属性来遍历。其实在Collection里有专有的遍历方式:迭代器遍历(Iterator)
Iterator :接口中有以下的方法:
boolean hasNext() :如果有元素可以迭代,那么返回true,否则返回false
Object next()返回迭代的下一个元素。
存储String类型的元素
public class IteratorDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList() ;
//添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("javaee");
//通过集合获取迭代器
Iterator it = c.iterator() ;
//获取下一个元素
/*System.out.println(it.next());
System.out.println(it.next());
System.out.println(it.next());
System.out.println(it.next());
//java.util.NoSuchElementException :此处已经没有元素了,但是还要获取,出现了这个异常
System.out.println(it.next()); */
//改进:需要判断是否有下一个可以迭代的元素,有,就获取,没有,不执行
while(it.hasNext()) {
// Object obj = it.next() ;
// 需求:打印字符串同时,获取长度
// String str = (String) obj ;
String str = (String)(it.next()) ;
System.out.println(str+"---"+str.length());
}
}
}
注意这里的java.util.NoSuchElementException异常,已经没有元素了,但是还要获取,就会出现这个异常。
下来我们来分析一下Iterator的源码:
interface Iterator{
public abstract boolean hasNext() ;
public Object next();
}
interface Iterable{
Iterator iterator() ;
}
interface Collection extends Iterable{
Iterator iterator() ;
}
inteface List extends Collection{
public abstract boolean hasNext() ;
public Object next();
Iterator iterator() ;
}
class ArrayList implements List{
public Iterator iterator() {
return new Itr();//Itr这个类就是Iterator的子实现类
}
private class Itr implements Iterator{
//实现了hasNext()和next()
public boolean hasNext(){
}
public Object next(){
}
}
}
需求:存储自定义对象并遍历(使用专有遍历方式)
public class IteratorDemo2 {
public static void main(String[] args) {
//创建集合对象:
Collection c = new ArrayList() ;
//创建学生对象
Student s1 = new Student("张三", 27) ;
Student s2 = new Student("李四", 29) ;
Student s3 = new Student("王五", 25) ;
//添加集合中
c.add(s1) ;
c.add(s2) ;
c.add(s3) ;
//获取迭代器
Iterator it = c.iterator() ;
while(it.hasNext()) {
Student s = (Student)it.next() ;
System.out.println(s.getName()+"="+s.getAge());
}
}
}
在以后的实际开发中,我们常用以下代码或者增强for循环来遍历,增强for循环以后再讲:
Iterator it = c.iterator() ;
while(it.hasNext()) {
Student s = (Student)it.next() ;
System.out.println(s.getName()+"="+s.getAge());
}