Iterator(迭代器)接口

1. Iterator接口

  • 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.IteratorIterator接口也是Java集合中的一员,但它与CollectionMap接口有所不同。

    • Collection接口与Map接口主要用于存储元素

    • Iterator,被称为迭代器接口,本身并不提供存储对象的能力,主要用于遍历Collection中的元素

  • Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。

    • public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。

    • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。

  • Iterator接口的常用方法如下:

    • public E next():返回迭代的下一个元素。

    • public boolean hasNext():如果仍有元素可以迭代,则返回 true。

  • 注意:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常

举例:

package com.atguigu.iterator;  
​  
import org.junit.Test;  
​  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Iterator;  
​  
public class TestIterator {  
    @Test  
    public void test01(){  
        Collection coll = new ArrayList();  
        coll.add("小李广");  
        coll.add("扫地僧");  
        coll.add("石破天");  
​  
        Iterator iterator = coll.iterator();  
        System.out.println(iterator.next());  
        System.out.println(iterator.next());  
        System.out.println(iterator.next());  
        System.out.println(iterator.next()); //报NoSuchElementException异常  
    }  
​  
    @Test  
    public void test02(){  
        Collection coll = new ArrayList();  
        coll.add("小李广");  
        coll.add("扫地僧");  
        coll.add("石破天");  
​  
        Iterator iterator = coll.iterator();//获取迭代器对象  
        while(iterator.hasNext()) {//判断是否还有元素可迭代  
            System.out.println(iterator.next());//取出下一个元素  
        }  
    }  
}  
​

2. 迭代器的执行原理

Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,接下来通过一个图例来演示Iterator对象迭代元素的过程:

image-20220407235130988

使用Iterator迭代器删除元素:java.util.Iterator迭代器中有一个方法:void remove() ;

Iterator iter = coll.iterator();//回到起点  
while(iter.hasNext()){  
    Object obj = iter.next();  
    if(obj.equals("Tom")){  
        iter.remove();  
    }  
}

注意:

  • Iterator可以删除集合的元素,但是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。

  • 如果还未调用next()或在上一次调用 next() 方法之后已经调用了 remove() 方法,再调用remove()都会报IllegalStateException。

  • Collection已经有remove(xx)方法了,为什么Iterator迭代器还要提供删除方法呢?因为迭代器的remove()可以按指定的条件进行删除。

例如:要删除以下集合元素中的偶数

package com.atguigu.iterator;  
​  
import org.junit.Test;  
​  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Iterator;  
​  
public class TestIteratorRemove {  
    @Test  
    public void test01(){  
        Collection coll = new ArrayList();  
        coll.add(1);  
        coll.add(2);  
        coll.add(3);  
        coll.add(4);  
        coll.add(5);  
        coll.add(6);  
​  
        Iterator iterator = coll.iterator();  
        while(iterator.hasNext()){  
            Integer element = (Integer) iterator.next();  
            if(element % 2 == 0){  
                iterator.remove();  
            }  
        }  
        System.out.println(coll);  
    }  
}  

在JDK8.0时,Collection接口有了removeIf 方法,即可以根据条件删除。(暂时不讲)

package com.atguigu.collection;  
​  
import org.junit.Test;  
​  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.function.Predicate;  
​  
public class TestCollectionRemoveIf {  
    @Test  
    public void test01(){  
        Collection coll = new ArrayList();  
        coll.add("小李广");  
        coll.add("扫地僧");  
        coll.add("石破天");  
        coll.add("佛地魔");  
        System.out.println("coll = " + coll);  
​  
        coll.removeIf(new Predicate() {  
            @Override  
            public boolean test(Object o) {  
                String str = (String) o;  
                return str.contains("地");  
            }  
        });  
        System.out.println("删除包含\"地\"字的元素之后coll = " + coll);  
    }  
}

3. foreach循环

  • foreach循环(也称增强for循环)是 JDK5.0 中定义的一个高级for循环,专门用来遍历数组和集合的。
  • foreach循环的语法格式:
for(元素的数据类型 局部变量 : Collection集合或数组){   
    //操作局部变量的输出操作  
}  
//这里局部变量就是一个临时变量,自己命名就可以
  • 举例:
package com.atguigu.iterator;  
​  
import org.junit.Test;  
​  
import java.util.ArrayList;  
import java.util.Collection;  
​  
public class TestForeach {  
    @Test  
    public void test01(){  
        Collection coll = new ArrayList();  
        coll.add("小李广");  
        coll.add("扫地僧");  
        coll.add("石破天");  
        //foreach循环其实就是使用Iterator迭代器来完成元素的遍历的。  
        for (Object o : coll) {  
            System.out.println(o);  
        }  
    }  
    @Test  
    public void test02(){  
        int[] nums = {1,2,3,4,5};  
        for (int num : nums) {  
            System.out.println(num);  
        }  
        System.out.println("-----------------");  
        String[] names = {"张三","李四","王五"};  
        for (String name : names) {  
            System.out.println(name);  
        }  
    }  
}
  • 对于集合的遍历,增强for的内部原理其实是个Iterator迭代器。如下图。

image-20220128010114124

  • 它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。
Java基础

Collection接口及方法

2025-8-10 13:52:35

Java基础

Collection子接口1:List接口

2025-8-10 15:33:49

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索