我是Java的新手,我真的很困惑迭代器和可迭代器。谁能给我解释一下并举几个例子吗?
当前回答
Iterable是一系列可以迭代的元素的简单表示。它没有任何迭代状态,例如“当前元素”。相反,它只有一个产生Iterator的方法。
迭代器是具有迭代状态的对象。它允许您使用hasNext()检查是否有更多元素,并使用next()移动到下一个元素(如果有)。
通常,Iterable应该能够产生任意数量的有效迭代器。
其他回答
我将回答这个问题,特别是关于数组列表的例子,以便帮助你更好地理解。
可迭代接口强制其子类实现抽象方法'iterator()'。
公共接口Iterable { ... abstract Iterator<T> Iterator ();//返回T类型元素的“迭代器”(不是迭代器)。 ... }
迭代器接口强制其子类实现抽象方法“hasNext()”和“next()”。
迭代器{ ... 抽象布尔hasNext();//如果迭代有更多元素则返回true。 抽象E next();//返回迭代中的下一个元素。 ... }
ArrayList实现了List, List扩展了Collection, Collection扩展了Iterable.. 也就是说,你可以这样看待这种关系 'Iterable <- Collection <- List <- ArrayList'
. 而Iterable, Collection和List只声明了抽象方法iterator()而ArrayList单独实现了它。
我将用'iterator()'方法显示ArrayList源代码,如下所示,以获取更详细的信息。
'iterator()'方法返回'Itr'类的对象,该对象实现'iterator '。
public class ArrayList<E> ... implements List<E>, ... { ... public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { ... public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } ... } }
其他一些方法或类将通过使用Iterator (Itr)迭代ArrayList等集合的元素。
这里有一个简单的例子。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String string = iterator.next();
System.out.println(string);
}
}
现在明白了吗?:)
Iterable的实现提供了自身的迭代器:
public interface Iterable<T>
{
Iterator<T> iterator();
}
迭代器是一种简单的方法,允许一些人在没有赋值权限的情况下循环遍历数据集合(尽管有删除的能力)。
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
看到Javadoc。
除了ColinD和Seeker的答案。
简单来说,Iterable和Iterator都是Java集合框架中提供的接口。
可迭代的
如果一个类想要有一个for-each循环来遍历它的集合,它必须实现Iterable接口。但是,for-each循环只能用于向前循环该集合,并且不能修改该集合中的元素。但是,如果您想要的只是读取元素数据,那么它就非常简单,并且由于Java lambda表达式,它通常是一行。例如:
iterableElements.forEach (x -> System.out.println(x) );
迭代器
此接口使您能够遍历集合,获取和删除其中的元素。每个集合类都提供了一个iterator()方法,该方法返回指向集合起点的迭代器。这个接口相对于iterable的优势在于,通过这个接口,您可以在集合中添加、修改或删除元素。但是,访问元素需要比iterable多一点的代码。例如:
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
来源:
Java Doc Iterable Java Doc迭代器
在java中的每个循环中都引入了Iterable
public interface Collection<E> extends Iterable<E>
Iterator是在Iterable上管理迭代的类。它维护当前迭代中我们所处的状态,并知道下一个元素是什么以及如何获取它。
如果一个集合是可迭代的,那么它可以使用迭代器迭代(因此可以在for每个循环中使用)。迭代器是遍历集合的实际对象。
推荐文章
- 将所有非字母数字字符替换为空字符串
- 漂亮地打印Java集合(toString不返回漂亮输出)
- 静态嵌套类在Java,为什么?
- 如何防止Eclipse在启动时挂起?
- Optional和Optional的区别是什么?flatMap和Optional.map?
- Java中枚举的命名:单数还是复数?
- Python迭代器中的has_next ?
- JavaBean和POJO之间的区别是什么?
- 注释在Java中如何使用,在哪里使用?
- 如何在Ubuntu下安装JDK 11 ?
- Spring Boot -无法确定数据库类型为NONE的嵌入式数据库驱动程序类
- 如何转换/解析从字符串到字符在java?
- 如何在Android中动态更改菜单项文本
- 如何比较两个没有时间部分的日期?
- 如何在Java中找到给定类的所有子类?