任何容器类,都必须有某种方式可以插入元素并将它们再次取回。毕竟,持有事物是容器最基本的工作。 对于List, add0是插入元素的方法之一,而get()是取出元素的方法之一。

如果从更高层的角度思考,会发现这里有个缺点:要使用容器,必须对容器的确切类型编程。 初看起来这没什么不好,但是考虑下面的情况:如果原本是对着List编码的, 但是后来发现如果能够把相同的代码应用于Set,将会显得非常方便,此时应该怎么做?或者打算从头开始编写通用的代码, 它们只是使用容器,不知道或者说不关心容器的类型,那么如何才能不重写代 码就可以应用于不同类型的容器?

迭代器(也是一种设计模式)的概念可以用于达成此目的。 迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。 此外,迭代器通常被称为轻量级对象: 创建它的代价小。 因此, 经常可以见到对迭代器有些奇怪的限制, 例如,Java的Iterator 只能单向移动,这个Iterator 只能用来:

(1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。

(2)使用next()获得序列中的下一个元素。

(3)使用hasNext()检查序列中是否还有元素。

(4)使用remove()将选代器新近返回的元素删除.

有了Iterator就不必为容器中元素的数量操心了,那是由hasNext()和next()关心的事情。 如果你只是向前遍历List,并不打算修改List对象本身,那么你可以看到foreach语法会显得更加简练。

Iterator还可以移除由next()产生的最后一个元素,这意味着调用remove()之前必须首先调用Next()方法。

接受对象容器并传递它,从而在每个对象上都执行操作,这种思想很强大。


      Listlterator 是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。尽管 Iterator只能向前移动,但是Listlterator 可以双向移动。它还可以产生相对于选代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。你可以通过调用listlterator()方法产生一个指向List开始处的Listlterator,并且还可以通过调用listlterator(n)方法创建一个一开始就指向列表索引为n的元素处的Listlterator。

(1)Foreach 遍历集合元素

 public class ForeachDemo {

 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {

 		/*
 		 * JDK1.5特性:
 		 * 增强for循环。作用:用于遍历Collection集合or数组。
 		 * 格式:
 		 * for(元素类型 变量 :Collection容器or数组)
 		 * {
 		 * }
 		 *
 		 * 传统for循环和增强for循环有什么区别呢?
 		 * 增强for必须有被遍历的目标。该目标只能是Collectionor数组。
 		 *
 		 */

 		Collection coll = new ArrayList();

 		coll.add("abc1");
 		coll.add("abc2");
 		coll.add("abc3");

 		for(Object obj : coll){
 			System.out.println(obj);
 		}
 		/*
 		for (Iterator it = coll.iterator(); it.hasNext();) {
 			Object obj = it.next();
 			System.out.println(obj);

 		}*/
 		//对于数组的遍历,如果不操作其角标,可以使用增强for,如果要操作角标。使用传统for。
 		int[] arr = {23,15,32,78};
 		for(int x : arr){
 			System.out.println("x="+x);
 		}

 	}

 }

(2)ListIterator遍历List元素

 public class ListIteratorDemo {

 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {

 		List list = new ArrayList();

 		list.add("abc1");
 		list.add("abc2");
 		list.add("abc3");
 		list.add("abc4");

 		/*
 		//在遍历的过程中,如果遍历到abc2,添加一个元素haha
 		for (Iterator it = list.iterator(); it.hasNext();) {
 			Object obj = it.next();//java.util.ConcurrentModificationException

 		//迭代过程中使用了使用了集合对象同时对元素进行操作。导致了迭代的不确定性。引发了该异常。
 		//解决思想:在迭代过程中,想要执行一些操作,使用迭代器的方法就可以了。

 			if(obj.equals("abc2")){
 				list.add("haha");
 			}
 		}*/

 //		使用list集合的特有的迭代器。ListIterator  通过List集合的方法listIterator()获取该迭代器对象。
 //		ListIterator可以实现在迭代过程中的增删改查。
 		for (ListIterator it = list.listIterator(); it.hasNext();) {
 			Object obj =  it.next();

 			if(obj.equals("abc2")){
 				it.add("haha");
 			}

 		}

 		System.out.println(list);
 	}

 }

2018-01-04

内容来自传智播客课程

Java容器---迭代器的更多相关文章

  1. 迭代器模式在 Java 容器中的实现

    迭代器接口是迭代器模式实现的精髓: public interface Iterator<E> { boolean hasNext(); E next(); ... } 假设某容器名为 Xx ...

  2. 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用

    迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...

  3. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  4. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  5. 【Java心得总结五】Java容器上——容器初探

    在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成 ...

  6. java容器---集合总结

    思考为什么要引入容器这个概念? Java有多种方式保存对象(应该是对象的引用),例如使用数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定 ...

  7. 3)Java容器

    3)Java容器   Java的集合框架核心主要有三种:List.Set和Map.这里的 Collection.List.Set和Map都是接口(Interface). List lst = new ...

  8. JAVA容器

    JAVA容器 一.容器体系结构 java.util 二.迭代器Iterator<E> 迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构.迭代器通常被 ...

  9. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

随机推荐

  1. Codeforces Round #532

    以后不放水题了 C.NN and the Optical Illusion 复习一下高中数学即可 $\frac{ans}{ans+r}=\sin \frac{\pi}{n}$ 解方程 #include ...

  2. 【Asp.net入门04】第一个ASP.NET 应用程序-如何添加Web窗体到网站中

    添加Web窗体 本部分内容: 什么是web form 怎样添加web form 1.添加Web窗体到项目中 Web 窗体是一项 ASP.NET 功能,您可以使用它为 Web 应用程序创建用户界面.We ...

  3. img、列表和table标签

    一.img图片 <body> <a href="https://www.fmtxt.com"> <img src="images/1.jpg ...

  4. SQL Server 2012安装图解

    SQL Server 2012 Enterprise Edition安装图解... 第一部分:安装前的准备 1.疑问:一个PC上可以安装多个SQL Server数据库么 答案:可以的.每一个安装的时候 ...

  5. Block的copy时机

    什么时候栈上的Block会复制到堆上呢? 1.调用Block的copy实例方法 2.Block作为函数返回值返回时 3.将Block赋值给附有__strong修饰符id类型的类或Block类型成员变量 ...

  6. Linux装机利器Cobbler安装配置

     Linux装机利器Cobbler安装配置 2011-05-27 15:31:05 分类: LINUX 一.安装环境 centos 5.4 关掉iptables 关掉 selinux selinux ...

  7. 英雄无敌3开源引擎vcmi的编译安装

    TAGS: Heroes3, vcmi, opensourceDATE: 2013-08-23 vcmi是什么? vcmi 是经典的 SLG 英雄无敌3 的开源游戏引擎.原来的英雄无敌3只能在Wind ...

  8. thinkphp 原数据更新

    调用TP的save方法更新数据时,如果新数据与数据库中得数据一致, 那么执行M('table')->save(data)方法时,该方法会返回false.现在的需求是,哪怕用户要更新的数据与原数据 ...

  9. react页面间传递参数

    react-router页面跳转,带请求参数 this.context.router.push({pathname:'/car_datail',state:{item:"hello" ...

  10. 2017-2018-2 20179205《网络攻防技术与实践》Windows攻击实验

    Windows攻击实验 实验描述: 使用Metaspoit攻击MS08-067,提交正确得到远程shell过程的截图(不少于五张). MS08-067漏洞介绍   MS08-067漏洞的全称为&quo ...