首页 > 代码库 > 初识java集合——迭代器
初识java集合——迭代器
* Collection接口中有2个基本的方法
* add和iterator
*
* add(E e)是用于向集合中添加元素,如果添加元素成功,则返回true, 反之为false(例如向集里面添加,因为集是不允许重复的)
*
* Iterable接口只包含了一个方法
* Iterator<E> iterator();
* 编译器将foreach循环翻译为带有迭代器的循环
* foreach可以与任何实现了Iterable接口的对象一起工作
* Collection接口扩展了Iterable接口,因此标准库中的任何集合都可以使用foreach循环
*
* Iterator接口包含了三个方法
* next,hasNext,remove
* 注意,迭代器的位置并不是索引的位置,而是元素之间的空隙,用"|" 表示迭代器的话, |ABC A|BC AB|C ABC| (3次next)
* 我们通过反复调用next来达到遍历的目的,当到达了末尾继续的话,会抛出NoSuchElementException异常
* hasNext用于返回是否还有下一个元素
* 查找和迭代器位置变更时紧密相连的,查找元素的唯一方法是先调用next方法,迭代器越过了这个元素就能够获取这个元素了
* remove也是一样的,删除元素也必须要先越过这个元素才可以
*
*
* 元素被访问的顺序取决于集合类型:比如对于HashSet中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定能够遍历到
* 集合中的所有元素,但无法预知随机的次序出现。
*
* ListIterator-----------------------------------------------------------------------------------------------------------------
*
* 只有对于自然有序的集合使用迭代器添加元素才有实际意义,因此在Iterator接口中没有add方法,但在他子接口ListItrator中包含了add方法
* 与Collection.add方法不同,该方法是void的,此外,ListItrator还提供了2反向遍历的方法
* E previous();
* boolean hasPrevious();
* previous与next一样,都是要跨越才可以获取,而previous后调用remove删除的是此时右侧的元素
*
* 当用一个刚刚由Iterator方法返回,并且指向链表表头的迭代器用add,则会添加在表头;
* 当迭代器越过最后一个元素的时候(hasNext为false)时,添加的元素就是末尾;
*
* set方法用于用一个新的元素去替换 调用next或previous返回的元素
*
* ListIterator还有一个方法可以告知当前位置的索引
* nextIndex返回下一次调用next方法返回元素的整数索引
* previous返回的是下一次调用previous方法返回元素的整数索引
* 如果有一个整数索引n,x.listIterator将返回一个迭代器,这个迭代器指向索引为n
*
* !!当一个迭代器指向另一个迭代器刚刚删除的元素,现在这个迭代器就是无效的,并且不应该再被使用
* ListIterator的设计使它能够检测到这种修改:如果迭代器发现她的集合被另一个迭代器修改或或者被该集合自身方法修改了
* 就会抛出ConcurrentModificationException
*
* 每个迭代器都维护一个独立的计数值,在每个迭代器方法的开始出,检查自己改写操作的计数值是否与集合的改写操作数一致,不一致
* 则抛出ConcurrentModificationException错误;
*
* 因此我们需要遵循这么一个简单的规则
* 可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读列表,此外单独设置一个迭代器既可以写又可以读
*
初识java集合——迭代器