Iterable与Iterator

2024-05-15 14:12
文章标签 iterator iterable

本文主要是介绍Iterable与Iterator,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Iterator

public interface Iterator<E> {}

terator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下:

forEachRemaining(Consumer<? super E> action):为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常

hasNext():如果迭代器中还有元素,则返回true。

next():返回迭代器中的下一个元素

remove():删除迭代器新返回的元素。

例子:

import java.util.*;
public class TestIterator {public static void main(String[] args) {ArrayList<String> a = new ArrayList<String>();a.add("aaa");a.add("bbb");a.add("ccc");System.out.println("Before iterate : " + a);Iterator<String> it = a.iterator();while (it.hasNext()) {String t = it.next();if ("bbb".equals(t)) {it.remove();}}System.out.println("After iterate : " + a);}
}

注意:

(1)Iterator只能单向移动。

(2)Iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。

ListIterator

Interface ListIterator<E>{}

 

包含的方法有:

(1)双向移动(向前/向后遍历).

(2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.

(3)可以使用set()方法替换它访问过的最后一个元素.

Iterator和ListIterator区别
我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了。但是在使用的时候也是有不同的。List和Set都有iterator()来取得其迭代器。对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面:

(1)ListIterator有add()方法,可以向List中添加对象,而Iterator不能


(2)ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。


(3)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。


(4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。

Iterable

or each原理

其实for each循环内部也是依赖于Iterator迭代器,只不过Java提供的语法糖,Java编译器会将其转化为Iterator迭代器方式遍历。我们对以下for each循环进行反编译:

 for (Integer i : list) {System.out.println(i);}

反编译后:

Integer i;
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){i = (Integer)iterator.next();        }

有一个问题,为什么不直接将hasNext(),next()方法放在Iterable接口中,其他类直接实现就可以了?

原因是有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个Iterator内部类,例如LinkedList中的ListItrDescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。

这篇关于Iterable与Iterator的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992032

相关文章

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

Simulink代码生成: For Iterator子系统及其代码

本文研究Simulink中的For Iterator子系统及其生成的代码。 文章目录 1 Simulink中的For Iterator子系统2 For Iterator子系统建模示例3 For Iterator子系统的代码4 总结 1 Simulink中的For Iterator子系统 不管是在C语言还是Matlab脚本编程的时候,都避免不了使用for循环来反复执行某一段代码。在

Enumeration 接口与 Iterator 接口的区别

Enumeration 接口与 Iterator 接口的区别 1、功能1.1 Enumeration1.2 Iterator 2、安全性和并发性3、总结 💖The Begin💖点点关注,收藏不迷路💖 Enumeration和Iterator是用于遍历集合的两个接口,但它们之间存在一些显著的区别。 1、功能 1.1 Enumeration 提供基本的遍历功能

Iterator和ListIterator比较

在使用java集合的时候,很多情况都能用到Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢? 下面我们详细分析。 这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示: 这里假设集合List由四个元素List1、List2、List

Iterator接口的简单用法

Iterator迭代接口是专门用来进行迭代输出的接口,定义如下: public interface Iterator<E>{ } Iterator 接口提供的常用方法如下: 序号常用方法说明1public boolean hasNext()判断集合是否有下一个元素2pulbic E next()取出当前元素3public void remove()删除当前元素 Iterator 接

java篇 常用工具类 0x03:Iterator 与 Iterable 接口

文章目录 Iterator 接口Iterable 接口手动实现 Iterable 接口示例 Iterator 接口 Iterator 接口在 java.util 包中。实现了 Iterator 接口的类就可以支持遍历操作。 public interface Iterator<E> {// 只需要关注到这两个抽象方法boolean hasNext(); // 还有没有

1082 MANAGER vector+iterator

sicily对格式的要求真是奇葩! // Problem#: 1082// Submission#: 2619361// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License// URI: http://creativeco

vector删除元素后iterator失效

1. 对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。 for (iter = cont.begin(); it != cont.end();) {    (

ES6 之 Iterator

1、简介 JavaScript 有四种表示 “集合” 数据集合:Array、Object、Map 以及 Set,用户可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map 的成员是对象。这样就需要一种统一的接口机制,来处理所有不同的数据结构。遍历器(Iterator)就是这样一种机制,它是一种接口,为各种不同的数据结构 提供统一的访问机制。任何数据结构只要部署 Iterator

自修C++Primer----3.4迭代器(iterator)的介绍

目录 1.迭代器的使用  1.1迭代器运算符 1.2从一个元素指向下一个元素 1.3迭代器的类型 1.4begin和end操作符 1.5解引用操作符和成员访问 1.6引入迭代器失效 1.7全部改成大写的一个练习 2.使用迭代器运算 我们可以使用下标运算符访问string里面的字符或者是这个vector里面的元素,另外还有一种简单的机制可以实现这个效果,就是迭代器; 迭代器