Java Review (二十五、集合----- Iterator接口)

简介: Java Review (二十五、集合----- Iterator接口)

Iterator接口 也是 Java 集合框架的成员 , 但它与 Collection 系列 、 Map 系列 的集合不 一样 :  Collection系列集合、 Map 系列集合主要用于盛装其他对象,而 Iterator 则主要用于遍历(即迭代访问)  Collection集合中的元素, Iterator 对象也被称为迭代器

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

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

  • boolean hasNext(): 如果被迭代的集合元素还没有被遍历完 ,则返回 true 。
  • Object next(): 返回集合里的下一个元素 。
  • void remove(): 删除集合里上一次 next 方法返回的元素 。
  • void forEachRemaining(Consumer action) ,这是 Java 8 为Iterator 新增的默认方法,该方法可使用Lambda 表达式来遍历集合元素 。

下面程序示范了通过 Iterator 接口来遍历集合元素 :

public class IteratorTest
{
  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);
  }
}

Iterator 仅用于遍历集合 , Iterator 本身并不提供盛装对象的能力 。

当使用 Iterator 迭代访问 Collection 集合元素时 , Collection  集合里的元素不能被改变,只有通过Iterator 的 remove()方法删除上 一 次 next()方法返回的集合元素才可以;否则将会引发  java .util.ConcurrentModificationException 异常 。 下面程序示范了这一 点 :

public class IteratorErrorTest
{
  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())
    {
      String book = (String)it.next();
      System.out.println(book);
      if (book.equals("疯狂Android讲义"))
      {
        // 使用Iterator迭代过程中,不可修改集合元素,下面代码引发异常
        books.remove(book);
      }
    }
  }
}

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

Java 8 起为Iterator 新增了 一个 forEachRemaining(Consumer action)方法,该方法所需的  Consumer参数同样也是函数式接口 。 当程序调用 Iterator 的 forEachRemaining(Consumer  action)遍历集合元素时,程序会依次将集合元素传给 Consumer的 accept(T t)方法(该接口中唯一的抽象方法) 。

如下程序示范了使用 Lambda 表达式来遍历集合元素:

public class IteratorEach
{
  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();
    // 使用Lambda表达式(目标类型是Comsumer)来遍历集合元素
    it.forEachRemaining(obj -> System.out.println("迭代集合元素:" + obj));
  }
}

除了使用迭代器以外,使用 Java 5 提供的 foreach 循环迭代访问集合元素更加便捷 。

如下程序示范了使用 foreach 循环来迭代访问集合元素 :

public class ForeachTest
{
  public static void main(String[] args)
  {
    // 创建集合、添加元素的代码与前一个程序相同
    Collection books = new HashSet();
    books.add(new String("轻量级Java EE企业应用实战"));
    books.add(new String("疯狂Java讲义"));
    books.add(new String("疯狂Android讲义"));
    for (Object obj : books)
    {
      // 此处的book变量也不是集合元素本身
      String book = (String)obj;
      System.out.println(book);
      if (book.equals("疯狂Android讲义"))
      {
        // 下面代码会引发ConcurrentModificationException异常
        books.remove(book);     //①
      }
    }
    System.out.println(books);
  }
}

API:java.util.Iterator


参考:

【1】:《疯狂Java讲义》


目录
打赏
0
0
0
0
21
分享
相关文章
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
42 3
|
2月前
|
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
183 57
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
1月前
|
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
55 6
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
50 5
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
60 4
|
2月前
|
Java中内置的函数式接口
Java中内置的函数式接口
40 2
|
2月前
|
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
178 1
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等