写在前面:
我也是一名java语言的爱好者,仅以此文作为学习的记录,对于文中出现的代码规范,代码格式,算法效率等问题,希望各路大神不吝赐教,在下感激不尽。同是学习的同学也同样希望互相交流,取长补短。
以下内容是学习《java编程思想》(《Thinking in Java》)的笔记,包括对习题的实现。
问题的引出:如果相同的代码想应用到不同的容器类型(比如说一个原用于List容器的代码发现用于Set容器也有比较不错的效果),往往需要重写代码。使用迭代器可以解决这一问题。
————那么原因是什么呢?请往下看。
一。迭代器的介绍(摘自thinking in java):迭代器是一个对象,他的工作是遍历并选择序列中的对象。此外,迭代器通常被称为轻量级对象, 正因为它的创建代价小。Java中的Iterator只能单向移动,这个Iterator只能用来
<1>使用方法iterator()要求容器放回一个Iterator,Iterator将准备好返回序列的第一个元素。
List intLists = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8));
Iterator iterator = intLists.iterator();
<2>使用next()获得序列中的下一个元素
<3>使用hasNext()检查序列中是否还有元素(通常作为判断条件)
<4>使用remove()将迭代器新近返回的元素删除
关于remove方法,所谓“删除新近返回的”的意思是:删除最近一个next()返回的元素,我理解为当前迭代器“指”着的元素。
ArrayList intArrayLists = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8));
Iterator iterator = intArrayLists.iterator();
iterator.next();
iterator.remove();
System.out.println(intArrayLists);
这里要注意一点的是迭代器并不是独立的一个对象,事实上它是来操作容器的工具,通过迭代器的方法(比如remove)是直接影响到原容器的。
二.迭代器的意义。
2.1 之前在python中学过迭代器,为何迭代器的代价比较小呢,因为迭代器不是一次性产生所有元素,下一个元素的创建要经过一次迭代,也就是调用一次next函数。
2.2 容器可以通过调用iterator函数来创建一个对应类型的iterator对象,换句话说iterator对象可以接受任何容器调用iterator函数对它的初始化。这也就解释了为何迭代器可以同一不同类型容器的代码重用问题。
看下面的例子:
public class SimpleIterator {
public static void display(Iterator iterator){
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
}
public static void main(String[] args){
ArrayList intArrayLists = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8));
LinkedList intLinkLists = new LinkedList(Arrays.asList(8,7,6,5,4,3,2,1));
HashSet intHashSets = new HashSet(Arrays.asList(1,2,3,7,8,5,4));
TreeSet intTreeSets = new TreeSet(Arrays.asList(1,2,3,7,9));
display(intArrayLists.iterator());
display(intLinkLists.iterator());
display(intHashSets.iterator());
display(intTreeSets.iterator());
}
}
这里的display方法不包含任何有关它遍历的序列的类型信息。无论ArrayList,LinkedList等容器,display方法均可调用执行。所以可以说“迭代器统一了对容器的访问方式”。(For this reason, we sometimes say that iterators unify access to containers.)