- 浏览: 264174 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
saishangxue123:
文章写的清楚、明了,一气呵成,支持
什么是反射、反射能干什么、如何使用反射? -
allen3010:
1,2,3,4,5这六个数字。。。。。
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列
用Iterator模式实现遍历集合
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }
以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
首先看看java.util.Iterator接口的定义:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }
依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... }
在JDK1.5中,还对上面的代码在语法上作了简化(但是限于只读,如果需要remove,还是直接使用iterator):
// Type是具体的类型,如String。 for(Type t : c) { // 对t的操作... }
每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个Iterator接口即可,这就是面向对象的威力。
----------------------------------------------------------------
在遍历的过程中出现java.util.ConcurrentModificationException的问题参http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html
用Iterator模式实现遍历集合
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }
以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
首先看看java.util.Iterator接口的定义:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }
依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... }
在JDK1.5中,还对上面的代码在语法上作了简化(但是限于只读,如果需要remove,还是直接使用iterator):
// Type是具体的类型,如String。 for(Type t : c) { // 对t的操作... }
每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个 Iterator接口即可,这就是面向对象的威力。
----------------------------------------------------------------
在遍历的过程中出现java.util.ConcurrentModificationException的问题参http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html
如果想用foreach遍历自定义类的集合,自定义类通常需要实现implement iterable接口. 该接口定义了Iterator<T> iterator()方法. 有些时候这个iterator方法可以供用类里面的集合属性.iterator()返回.
示例:
示例2:
----------------------------------------------------------------------------
为什么一定要去实现Iterable这个接口呢?为什么不直接实现Iterator接口呢?
看一下JDK中的集合类,比如List一族或者Set一族,
都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。因为Iterator接口的核心方法next()或者hasNext()
是依赖于迭代器的当前迭代位置的。
如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。
来源 http://www.cnblogs.com/highriver/archive/2011/07/27/2077913.html
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }
以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
首先看看java.util.Iterator接口的定义:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }
依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... }
在JDK1.5中,还对上面的代码在语法上作了简化(但是限于只读,如果需要remove,还是直接使用iterator):
// Type是具体的类型,如String。 for(Type t : c) { // 对t的操作... }
每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个Iterator接口即可,这就是面向对象的威力。
----------------------------------------------------------------
在遍历的过程中出现java.util.ConcurrentModificationException的问题参http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html
用Iterator模式实现遍历集合
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }
以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。
为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
首先看看java.util.Iterator接口的定义:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }
依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... }
在JDK1.5中,还对上面的代码在语法上作了简化(但是限于只读,如果需要remove,还是直接使用iterator):
// Type是具体的类型,如String。 for(Type t : c) { // 对t的操作... }
每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种Iterator,它只需要获得这个 Iterator接口即可,这就是面向对象的威力。
----------------------------------------------------------------
在遍历的过程中出现java.util.ConcurrentModificationException的问题参http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html
如果想用foreach遍历自定义类的集合,自定义类通常需要实现implement iterable接口. 该接口定义了Iterator<T> iterator()方法. 有些时候这个iterator方法可以供用类里面的集合属性.iterator()返回.
示例:
class Teacher implements Iterable{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Iterator iterator() { return new Itr(); } public static void main(String[] args) { Teacher t = new Teacher(); t.setName("aaaaaaa"); t.setAge(23); for (Object o : t) { System.out.println(o.toString()); } } private class Itr implements Iterator{ private int cursor=0; // 属性的索引 private Field[] fields = Teacher.class.getDeclaredFields(); // 属性的数组 public boolean hasNext() { return cursor!=(Teacher.class.getDeclaredFields().length); } public Object next() { Object o=null; try{ fields[cursor].setAccessible(true); // 让内部类可以访问外部类的私有属性的值 o = fields[cursor].getName()+" "+fields[cursor].get(Teacher.this); cursor++; }catch(Exception e){ System.out.println(e); } return o; } public void remove() { // TODO Auto-generated method stub } } }
示例2:
import java.util.Iterator;//测试类 class Exec { public static void main(String[] args) throws Exception { // 创建学生集合类 Students students = new Students(10); // 通过for each语句迭代循环学生集合类的每个元素 for (Object obj : students) { Student stu = (Student) obj; System.out.println(stu.getSid() + ":" + stu.getName()); } } }// 支持for each迭代循环的学生集合类 class Students implements Iterable { // 存储所有学生类的数组 private Student[] stus; // 该构造函数可以生成指定大小的学生类变量数组,并初始化该学生类变量数组 public Students(int size) { stus = new Student[size]; for (int i = 0; i < size; i++) { stus[i] = new Student(String.valueOf(i), "学生" + String.valueOf(i)); } } // 实现Iterable接口的重要方法,返回自定义的迭代类变量 public Iterator iterator() { return new StudentIterator(); } // 实现Iterator接口的私有内部类,外界无法直接访问 private class StudentIterator implements Iterator { // 当前迭代元素的下标 private int index = 0; // 判断是否还有下一个元素,如果迭代到最后一个元素就返回false public boolean hasNext() { return index != stus.length; } // 返回当前元素数据,并递增下标 public Object next() { return stus[index++]; } // 这里不支持,抛出不支持操作异常 public void remove() { throw new UnsupportedOperationException(); } } }// 学生类 class Student { // 学生学号 private String sid; // 学生姓名 private String name; // 默认构造函数 public Student() { } // 支持属性值初始化的构造函数 public Student(String sid, String name) { setSid(sid); setName(name); } // 学生学号的读取函数 public String getSid() { return sid; } // 学生学号的设置函数 public void setSid(String sid) { this.sid = sid; } // 学生姓名的读取函数 public String getName() { return name; } // 学生姓名的设置函数 public void setName(String name) { this.name = name; } // 格式化字符信息输出 public String toString() { return this.sid + ":" + this.name; } }
----------------------------------------------------------------------------
为什么一定要去实现Iterable这个接口呢?为什么不直接实现Iterator接口呢?
看一下JDK中的集合类,比如List一族或者Set一族,
都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。因为Iterator接口的核心方法next()或者hasNext()
是依赖于迭代器的当前迭代位置的。
如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。
来源 http://www.cnblogs.com/highriver/archive/2011/07/27/2077913.html
发表评论
-
java时间大小比较
2015-04-02 21:48 1008摘自: http://blog.sina.com.cn/s/b ... -
StringBuffer的常用方法
2015-03-30 16:06 1002摘自:http://blog.csdn.net/deaful/ ... -
什么是反射、反射能干什么、如何使用反射?
2013-08-16 00:03 4895//来源互联网 一、什 ... -
Class.forName···关于Class. 的应用介绍
2013-08-15 23:36 1195//摘自互联网 Class.forName(xxx.xx ... -
java泛型map的用法(转2)
2013-07-25 23:04 92361.声明一个map: Map map = ne ... -
java泛型map的用法(转)
2013-07-25 22:56 3156http://www.apkbus.com/blog-2079 ... -
关于日期 Date Calendar
2013-07-23 22:46 1168import java.security.Timestam ... -
正则表达式 例子
2013-07-22 23:00 855import java.util.regex.Matche ... -
Iterator的使用方法
2013-07-18 21:45 0import java.util.*; publ ... -
泛型的写法种种
2013-07-18 21:41 1069public class Generics<T> ... -
ArrayList ,LinkedList, TreeSet的使用方法
2013-07-18 21:35 2359import java.util.*; public ... -
Stack的使用方法
2013-07-18 21:26 1405import java.util.Stack; ... -
Hashtable的使用方法介绍
2013-07-18 21:24 23251**************************** ... -
老式枚举的使用方法
2013-07-18 21:23 981import java.util.Enumeration; ... -
java中Map的各种排序介绍
2013-07-14 13:24 1759//本篇来源于互联网 HashMap: 最常用的Ma ... -
java配置文件用法
2013-04-14 22:43 1338package cn.com.mfsoft.config; ... -
java利用反射得到实例
2013-04-10 22:44 1313对于面向接口编程的项目免不了要一反射相接触,动态得到实例: ... -
spring的beanFactory和factoryBean
2013-04-05 16:10 2174spring的beanFactory和factoryBe ... -
Spring配置文件总结
2013-04-05 16:05 917Spring配置文件总结(转) 2010-06-07 23: ... -
Spring 的微内核与FactoryBean扩展机制
2013-04-05 15:49 1665Spring 的微内核与FactoryBean扩展机制 ...
相关推荐
java 中 Iterator 与Iterable的作用;java语言需要更多基础沉淀,扎扎实实,后面的各种项目都会如何天翼。进行更高阶的用法和一些框架的原理都离开最基础的东西,基础虽然枯燥,但是也很有乐趣。
在Python编程语言中,Iterator(迭代器)和Iterable(可迭代对象)是两个非常核心的概念,它们是实现数据迭代操作的基础。理解这两个概念的区别对于掌握Python中的集合类型以及循环结构至关重要。 首先,我们来看...
`Iterator`是直接与集合交互的,通过调用`iterator()`方法获取一个迭代器实例,然后通过这个迭代器来访问集合元素。然而,`Iterator`并不包含任何关于集合的信息,只专注于如何遍历元素。这意味着,如果一个集合直接...
10. **Iterator与Iterable**:Iterator用于遍历集合,Iterable是所有可迭代对象的超接口,使得foreach循环成为可能。 在ItcastOA第04天工程的压缩包中,你可能会找到针对这些概念的实例代码,通过阅读和实践这些...
- Iterator与Iterable:遍历集合对象的方式,以及foreach循环的原理。 - 泛型:了解泛型的引入,如何使用泛型来增强代码类型安全性和复用性。 4. **高级主题** - 异常处理:异常分类、捕获、抛出,以及自定义...
"Java中Iterable与Iterator用法详解" Java中Iterable与Iterator是两个非常重要的概念,它们都是Java集合框架中最基本的组件,用于遍历和迭代集合中的元素。Iterable是Java中的一个接口,表示可以被迭代的对象,而...
在Java编程语言中,`Iterable`和`Iterator`是两个非常重要的接口,它们在处理集合数据时起到核心作用。理解这两个接口的关系对于高效地操作Java集合框架至关重要。 首先,我们来了解一下`Iterable`接口。`Iterable`...
- **迭代器**:如何遍历集合,以及Iterator与Iterable的区别。 - **泛型**:理解类型擦除,通配符使用,以及泛型的边界。 3. **字符串处理** - **String类**:不可变性,字符串连接的效率问题,以及...
Iterable接口的定义位于java.lang.Iterable接口中,它只有一个方法,即iterator(),该方法返回一个Iterator对象,该对象用于迭代对象的元素。Iterable接口的定义如下所示: ```java public interface Iterable<T> {...
前言 Python生成器(generator)并不是一...1. Iterator与Iterable 首先明白两点: Iterator(迭代器)是可迭代对象; 可迭代对象并不一定是Iterator; 比较常见的数据类型list、tuple、dict等都是可迭代的,属于collecti
在Java编程语言中,`Iterator`接口和`Iterable`接口是处理集合数据的重要工具,而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于数据传输和存储。这个"iterator_jsonDemo"实例结合了这...
### Iterator与Iterable - **`Iterator`接口**:用于遍历集合元素。 - **`Iterable`接口**:使一个类具有可迭代性,可以使用`for-each`循环。 ### 笔试题总结 - **常见笔试题**:包括但不限于字符串反转、数组...
如果你正在使用的类库版本不支持`iterator()`方法,比如你引用了一个旧版本的集合库,而这个版本并未实现`Iterable`接口,那么`iterator()`将不可用。确保你的项目依赖是最新的,并且与你的代码兼容。 2. **类型...
在Java中,集合框架通过实现`Iterable`接口并提供一个`iterator()`方法来支持迭代器模式。下面我们将深入探讨`java.util.AbstractList`类中如何实现迭代器模式。 #### 四、`java.util.AbstractList`中的迭代器实现 ...
`iterator()`方法是`Iterable`接口的一个方法,由`Collection`接口继承。当你调用一个集合对象的`iterator()`方法时,它会返回一个实现了`Iterator`接口的对象,这个对象可以用来遍历集合中的元素。例如: ```java...
获取`Iterator`实例的方法非常简单,只需调用实现了`Iterable`接口的类所提供的`iterator()`方法即可。例如,对于一个`List`类型的集合: ```java List<String> list = new ArrayList(); list.add("a"); list.add("b...
在Python中可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了。 0x00 可迭代(Iterable) 简单的说,一个对象(在...
除了`Iterator`之外,还有一个相关的接口`Iterable`。这个接口主要用于定义一个可以被迭代的对象,它提供了一个`iterator()`方法,该方法返回一个迭代器对象。 ```java public interface Iterable<T> { Iterator...
`Iterable`接口定义了一个`iterator()`方法,返回一个`Iterator`实例。`Iterator`接口则包含`hasNext()`和`next()`方法。 ```java public interface Iterable<T> { Iterator<T> iterator(); } public interface ...