任何容器类,都必须有某种方式可以插入元素并将它们再次取回。毕竟,持有事物是容器最基本的工作。 对于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. 解题:洛谷 p1858 多人背包

    题面 设$dp[i][j]$表示容量为$i$时的第$j$优解,因为是优解,肯定$dp[i][j]$是随着$j$增大不断递减的,这样的话对于一个新加进来的物品,它只可能从两个容量的转移的前$k$优解中转 ...

  2. 【bzoj2754】【scoi2012】喵星球上的点名

    题解们: 1.首先可以被很多暴力给搞过去:我以前也是这样水过去的 2.ac自动机 2.1 抽离fail树 对点名建自动机,建$fail$树的时候只保留询问节点: 对于一个喵,子串==在自动机里匹配到的 ...

  3. Jmeter之性能测试

    Jmeter除了可以做接口测试外,还可以做性能测试.在 Jmeter中做性能测试,需要做如下相关设置 图片中有10个线程,Ramp-Up Period(in seconds)=1,那么线程的启动时间间 ...

  4. expect嵌套shell循环

    #!/bin/bash Detailtxt="test.txt" while read line do dest=`echo $line|awk '{print $1}'` ip= ...

  5. Configure文件学习

    Linux安装软件有一种方式就是通过源码安装,源码通常是一个压缩包,打开压缩包,经常会看到一个叫configure的文件,而不见makefile文件.通常我们在自己的电脑写应用的时候都是通过makef ...

  6. 兼容firefox,ie,谷歌,阻止浏览器冒泡事件,Firefox不支持event解决方法

    兼容firefox,ie,谷歌,阻止浏览器冒泡事件,Firefox不支持event解决方法 // 获取事件function getEvent(){ if(window.event) {return w ...

  7. [hadoop]mapreduce原理简述

    1.用于map的输入,先将输入数据切分成相等的分片,为每一个分片创建一个map worker,这里的切片大小不是随意订的,一般是与HDFS块大小一致,默认是64MB,一个节点上存储输入数据切片的最大s ...

  8. POJ 2485 Highways( 最小生成树)

    题目链接 Description The islandnation of Flatopia is perfectly flat. Unfortunately, Flatopia has no publ ...

  9. def 的传参数的问题

    测试了一下.关于python 的函数def里面的传参数问题: 1.传参顺序: # codig:utf-8 def function(a,b=1,*args,**kwargs): print(a,'\n ...

  10. Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again错误解决

    rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm  安装了epel源 但  yum -y ...