zoukankan      html  css  js  c++  java
  • 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讲义》

  • 相关阅读:
    DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
    UVA10071 Back to High School Physics
    UVA10071 Back to High School Physics
    UVA10055 Hashmat the Brave Warrior
    UVA10055 Hashmat the Brave Warrior
    UVA458 The Decoder
    UVA458 The Decoder
    HDU2054 A == B ?
    HDU2054 A == B ?
    POJ3414 Pots
  • 原文地址:https://www.cnblogs.com/three-fighter/p/13052924.html
Copyright © 2011-2022 走看看