我是Java的新手,我真的很困惑迭代器和可迭代器。谁能给我解释一下并举几个例子吗?
当前回答
实现Iterable接口允许一个对象作为foreach语句的目标。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
Iterator是一个接口,它具有迭代元素的实现。Iterable是一个提供迭代器的接口。
其他回答
除了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迭代器
如果一个集合是可迭代的,那么它可以使用迭代器迭代(因此可以在for每个循环中使用)。迭代器是遍历集合的实际对象。
在java中的每个循环中都引入了Iterable
public interface Collection<E> extends Iterable<E>
Iterator是在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);
}
}
现在明白了吗?:)
最重要的考虑是所讨论的项是否应该能够多次遍历。这是因为你总是可以通过再次调用iterator()来倒带一个Iterable,但是没有办法倒带一个iterator。
推荐文章
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?
- 应该……接住环内还是环外?