JAVA iterator与iterator模式

一 遇到问题----

List的两种遍历方法,如下代码所示:

<span style="font-family:SimSun;">import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class IteratorTest {
	static String []data = {"orange","apple","banana","pear","orange","grape"};
    static List list = new ArrayList<String>();
	// 利用iterator遍历
	public static void traversal1(){		
		Iterator iterator = list.iterator();
		while (iterator.hasNext()){
			System.out.println(iterator.next());
			
		}
		System.out.println(list);
	}
	public static void traversal2(){	
		list = Arrays.asList(data);
		for (String s : data){ // 利用for遍历
			System.out.println(s);
		}
	}
	public static void main(String[]args){
		for (int i =0;i<data.length;i++){
			list.add(data[i]);
		}
		traversal1();
		traversal2();
		
	}
}
</span>

代码中对List用两种方法生成,其实第二种List不是真正的List,只是Arrays$ArrayList,不能进行remove()等操作,这是后话。

二 提出问题------为什么需要iterator?优势?

java集合类

Collection是一个接口,由此产生诸多集合类,如List,Queue,Set,对Collection有时有遍历的需求,因此有上述问题的产生。本文以ArrayList为例,讲解java Iterator类和iterator模式

Iterator模式产生背景

在java中的List及其他集合类中需要遍历时,可以采用get()和for进行,但是这样有一个明显的缺点,List本身和对List的访问操作耦合性强,为了使得对List乃至Colletion的操作与数据本身分离,产生了iterator模式。

GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

Iterator模式原理

为了让使用者使用时不暴露内部细节,List等集合类必须自己封装一套访问提供给访问者,这套访问机制称为iterator,因此iteraotr必须由数据提供者进行实现


本文以javaArrayList的实现为例进行讲解,本文重点讲述iterator的实现思想,其余省略。

废话少说,上类图,ArrayListIterator的相关类图如下:


类图解析:

Iterator为一个接口,只定义了三个方法,hasNext(),next(),和remove()。

Collection接口继承Iterable接口,提供了一个iterator()方法,使得Collection子类通过iterator()方法获取Collection内部实现的Iterator对象。

ArrayList的内部具体实现iterator()方法,提供一个ListIterator的对象,由ArrayList实现

上文得知,iterator具体实现必须在ArrayList本身中实现,ArrayList实现的是一个ListIterator,实现部分代码如下:

public class ArrayList {
	/**
		other ....
	*/
	public Iterator<E> iterator(){
		return listIterator();
	}

	public ListIterator<E> listIterator ()
		return new ListIterator<E>(){
			/* 具体实现 */
			public boolean hasNext(){/* ... */ }
			public E next(){/* ... */}
			public remove(){/* ... */}
			
		}
	}
}


三 问题延伸------iterator与原有方法的对比

Iterator和List的remove

在List和iterator中都有remove这个方法,有什么区别看看定义:

Iterator:remove()

Removes from the underlying collection thelast element returned by this iterator (optional operation).

ArrayList的remove

remove(int index)

Removes theelement at the specified position in this list (optional operation).

从参数就能看出差别,iterator删除最后一个迭代过的元素,而List中则按照index进行删除,对ArrayList,每次删除一个元素都要进行移动,因此效率不高,下面是remove的代码片段。

public class ArrayList {
	/**
		other ....
	*/
	public Iterator<E> iterator(){
		return listIterator();
	}

	public ListIterator<E> listIterator ()
		return new ListIterator<E>(){
			/* 具体实现 */
			public boolean hasNext(){/* ... */ }
			public E next(){/* ... */}
			public remove(){/* ... */}
			
		}
	}
}


 
 


四问题总结-------iterator的使用建议

在使用集合类时,可以使用iterator进行遍历,不同的Collection实现有着不同的iterator,比如List中的iterator返回的ListIterator就有previous()等方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值