任何容器类,都必须有某种方式可以插入元素并将它们再次取回。毕竟,持有事物是容器最基本的工作。 对于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. bzoj 1539: [POI2005]Dwu-Double-row

    假设一列交换表示为1,不换表示为0. 身高相同的两个人相当于给其中两列了一个限制条件,要么是两个必须相等,要么一个为零一个为一. 有了关系后我们就可以把每列当成一个点建边,边权为0表示必须相同,1为必 ...

  2. 【2018北京集训(六)】Lcm

    Portal --> 出错啦qwq(好吧其实是没有) Description 给定两个正整数\(n,k\),选择一些互不相同的正整数,满足这些数的最小公倍数恰好为\(n\),并且这些数的和为\( ...

  3. iterm2切换显示屏vim乱行解决

    http://note.youdao.com/noteshare?id=5aec9d82cc3a95b6909e9966b4aa3227

  4. Go_13:Go常用功能总结一阶段

    1. go语言从键盘获取输入内容 <1. 最简单的办法是使用 fmt 包提供的 Scan 和 Sscan 开头的函数.请看以下程序: package main import "fmt& ...

  5. GO_02:GO语言开篇

    Go的发展史 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后 ...

  6. Hadoop生态圈-Hbase的Region详解

    Hadoop生态圈-Hbase的Region详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  7. Java消息队列三道面试题详解!

    面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...

  8. bzoj千题计划170:bzoj1968: [Ahoi2005]COMMON 约数研究

    http://www.lydsy.com/JudgeOnline/problem.php?id=1968 换个角度 一个数可以成为几个数的约数 #include<cstdio> #incl ...

  9. Java并发编程原理与实战三十:CountDownLatch与CyclicBarrier 区别

    相信每个想深入了解多线程开发的Java开发者都会遇到CountDownLatch和CyclicBarrier,大家也在网上看到各种介绍原理,代码的,以及他们区别(应付面试)的,但是很少能讲清楚:他们到 ...

  10. 张鑫旭:Promise异步编程模式

    参考文章: http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4 ...