迭代器是一个对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构,此外,迭代器通常被称为轻量级对象:创建它的代价小。因此,经常可以见到对迭代器有些奇怪的限制,例如Java的Iterator只能单向移动,这个Iterator只能用来:
(1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
(2)使用next()获得序列中下一个元素。
(3)使用hashnNext()检查序列中是否还有元素。
(4)使用remove()将迭代器新近返回的元素删除。
List<Pet> pets=Pets.arrayList(12); Iterator<Pet> it=pets.iterator(); while(it.hashNext()){ Pet p=it.next(); System.out.print(p); }
有了Iterator就不必为容器中元素的数量操心了,那是hashNext()和next()关心的事情了。
如果只是向前遍历List,并不打算修改List对象本身,那么那可以看到foreach语法会显得更加简洁。
foreach(Pet p: pets){ System.out.print(p); }
Iterator还可以移除由next()产生的最后一个元素,这意味着在调用remove()之前必须先调用next()。
ListIterator可以双向移动,它可以产生相对于迭代器在列表中指向当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它的访问过的最后一个元素,你可以通过调用ListIterator(n)方法创建一个一开始就指向列表引为n的元素处的ListIterator。
LinkedList也像ArrayList一样实现了基本的List接口,但是它执行某些操作(在List的中间插入和移除)时比ArrayList更高效,但在随机访问操作方面却要逊色一些。