• 8.2.2 使用Java8增强的Iterator遍历集合元素


    Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:

    • Collection系列集合、Map系列集合主要用于盛装其他对象,
    • Iterator对象也被称为迭代器,Iterator主要用于遍历(即迭代访问)Collection集合中的元素

    Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。

    Iterator接口方法

    Iterator接口里定义了如下4个方法

    方法 描述
    boolean hasNext() 如果被迭代的集合元素还没有被遍历完,则返回true
    Object next() 返回集合里的下一个元素
    void remove() 删除集合里上一次next方法返回的元素
    void forEachRemaining(Consumer action) 这是Java 8Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素
    ## 程序示例 ##
    下面程序示范了通过Iterator接口来遍历集合元素。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import java.util.*;

    public class
    {
    public static void main(String[] args)
    {

    Collection books = new HashSet();
    books.add("轻量级Java EE企业应用实战");
    books.add("疯狂Java讲义");
    books.add("疯狂Android讲义");
    // 获取books集合对应的迭代器
    Iterator it = books.iterator();
    while(it.hasNext())
    {
    // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换
    String book = (String)it.next();
    System.out.println(book);
    if (book.equals("疯狂Java讲义"))
    {
    // 从集合中删除上一次next方法返回的元素
    it.remove();
    }
    // 对book变量赋值,不会改变集合元素本身
    book = "测试字符串"; //①
    }
    System.out.println("集合中的数据:"+books);
    }
    }

    运行效果:

    1
    2
    3
    4
    疯狂Android讲义
    轻量级Java EE企业应用实战
    疯狂Java讲义
    集合中的数据:[疯狂Android讲义, 轻量级Java EE企业应用实战]

    Iterator仅用于遍历集合

    从上面代 大专栏  8.2.2 使用Java8增强的Iterator遍历集合元素码中可以看出, Iterator仅用于遍历集合, Iterator本身并不提供盛装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。

    Iterator必须依附于Collection对象

    Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。 Iterator提供了两个方法来迭代访问Collection集合里的元素,并可通过remove()方法来删除集合中上一次next()方法返回的集合元素。

    修改迭代变量的值对集合元素本身没有任何影响

    当使用Iterator对集合元素进行迭代时, Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响

    Iterator迭代时不可通过 其他方式 Collection集合里的元素

    当使用Iterator迭代访问Collection集合元素时:

    • 不可以通过集合对象修改Collection集合里的元素,例如:不能通过集合对象添加元素,也不能通过集合对象添加元素。
    • 如果要删除元素,只有通过Iterator对象的的remove方法才可以删除next()方法返回的集合元素.
    • 否则将会引发java.util.ConcurrentModificationException异常。

    程序示例

    下面程序示范了这一点。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import java.util.*;

    public class IteratorErrorTest {
    public static void main(String[] args) {

    Collection<String> collection = new HashSet<String>();
    collection.add("1");
    collection.add("2");
    collection.add("3");
    collection.add("4");
    // 获取books集合对应的迭代器
    Iterator<String> iterator = collection.iterator();
    while (iterator.hasNext()) {
    String book = iterator.next();
    System.out.println(book);
    if (book.equals("3")) {
    // 使用Iterator迭代过程中,不可以通过 集合对象 修改集合
    // collection.remove(book);
    collection.add("5");
    // 只有Iterator对象的remove方法才可以删除遍历的元素
    // iterator.remove();
    }
    }
    }
    }

    运行效果:

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
    at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)
    at IteratorErrorTest.main(IteratorErrorTest.java:14)

    上面程序中collection.remove(book);这行代码位于Iterator迭代块内,也就是在Iterator迭代Collection集合过程中修改了Collection集合,所以程序将在运行时引发异常。

    Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即引发ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。

    原文链接: 8.2.2 使用Java8增强的Iterator遍历集合元素

  • 相关阅读:
    SQL注入与防范
    JDCP连接池连接数据库报错:java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
    数据库连接池(基于MySQL数据库)
    使用JDBC连接MySQL数据库的一个基本案例
    快速排序的java实现
    在C++的函数中如何指定一个数组,使得这个数组的大小由函数的输入值来决定
    WORD2010如何把全角字母和数字批量转换成半角
    地图安卓
    浅谈java异常[Exception]
    Adapter的getView
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12347402.html
Copyright © 2020-2023  润新知