您的位置:首页 > 编程语言 > Java开发

【JAVA语法】持有对象--Java中迭代器Iterator的用法(初体验)

2018-03-16 17:06 351 查看
写在前面:    我也是一名java语言的爱好者,仅以此文作为学习的记录,对于文中出现的代码规范,代码格式,算法效率等问题,希望各路大神不吝赐教,在下感激不尽。同是学习的同学也同样希望互相交流,取长补短。
                                                                                                                                                      ——zsferrier@126.com以下内容是学习《java编程思想》(《Thinking in Java》)的笔记,包括对习题的实现。问题的引出:如果相同的代码想应用到不同的容器类型(比如说一个原用于List容器的代码发现用于Set容器也有比较不错的效果),往往需要重写代码。使用迭代器可以解决这一问题。
————那么原因是什么呢?请往下看。
一。迭代器的介绍(摘自thinking in java):迭代器是一个对象,他的工作是遍历并选择序列中的对象。此外,迭代器通常被称为轻量级对象, 正因为它的创建代价小。Java中的Iterator只能单向移动,这个Iterator只能用来<1>使用方法iterator()要求容器放回一个Iterator,Iterator将准备好返回序列的第一个元素。 List<Integer> intLists = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8));
Iterator<Integer> iterator = intLists.iterator();
<2>使用next()获得序列中的下一个元素<3>使用hasNext()检查序列中是否还有元素(通常作为判断条件)<4>使用remove()将迭代器新近返回的元素删除    关于remove方法,所谓“删除新近返回的”的意思是:删除最近一个next()返回的元素,我理解为当前迭代器“指”着的元素。
ArrayList<Integer> intArrayLists = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8));
Iterator<Integer> 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<Integer> iterator){
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
}
public static void main(String[] args){
ArrayList<Integer> intArrayLists = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8));
LinkedList<Integer> intLinkLists = new LinkedList<Integer>(Arrays.asList(8,7,6,5,4,3,2,1));
HashSet<Integer> intHashSets = new HashSet<Integer>(Arrays.asList(1,2,3,7,8,5,4));
TreeSet<Integer> intTreeSets = new TreeSet<Integer>(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.)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息