任何容器类,都必须有某种方式可以插入元素并将它们再次取回。毕竟,持有事物是容器最基本的工作。 对于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. C中有关引用和指针的异同

    参考于https://blog.csdn.net/wtzdedaima/article/details/78377201 C语言也学了蛮久的,其实一直都没有用到过或者碰到过引用的例子.前端时间再全面复 ...

  2. Ansible5:常用模块

    目录 ping模块 setup模块 file模块 copy模块 service模块 cron模块 yum模块 user模块与group模块 user模块 group示例 synchronize模块 f ...

  3. Docker应用一:docker介绍

    Docker介绍与安装 一.Docker与传统虚拟化区别 直接看下图:                  传统虚拟化实现架构                                   doc ...

  4. ElasticStack系列之十一 & 同步 mysql 数据的实践与思考

    问题 1. jdbc-input-plugin 只能实现数据库的追加,对于 elasticsearch 增量写入,但经常 jdbc 源一端的数据库可能会做数据库删除或者更新操作.这样一来数据库与搜索引 ...

  5. Java多态性的“飘渺之旅”

    原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 朵星人A:人类,是一个很奇妙的物种. 朵星人B:他们好像分为两种,嗯 先生,以及美女? 朵星人C:对,更年轻的有 ...

  6. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  7. What is an intuitive explanation of the relation between PCA and SVD?

    What is an intuitive explanation of the relation between PCA and SVD? 36 FOLLOWERS Last asked: 30 Se ...

  8. angularJS $resource

    $resource是一个更方便地与RESTful服务器API进行交互,可以方便地定义一个REST资源,而不必手动所有的声明CRUD方法的Service. 使用 1.要使用$resource首先要在HT ...

  9. IE10下 FormsAuthentication.SetAuthCookie无效的问

    问题是这样的,我在本地测试设置身份验证票据都没问题,发布到服务器后访问地址添加了一些特殊的字符,看起来像加过密的,如下: http://www.example.com/(F(1xe9eXIxPzMAL ...

  10. HDU 1556 Color the ball (树状数组 区间更新+单点查询)

    题目链接 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽&quo ...