我是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是一个提供迭代器的接口。
其他回答
如果一个集合是可迭代的,那么它可以使用迭代器迭代(因此可以在for每个循环中使用)。迭代器是遍历集合的实际对象。
Iterable是一系列可以迭代的元素的简单表示。它没有任何迭代状态,例如“当前元素”。相反,它只有一个产生Iterator的方法。
迭代器是具有迭代状态的对象。它允许您使用hasNext()检查是否有更多元素,并使用next()移动到下一个元素(如果有)。
通常,Iterable应该能够产生任意数量的有效迭代器。
Iterable的实现提供了自身的迭代器:
public interface Iterable<T>
{
Iterator<T> iterator();
}
迭代器是一种简单的方法,允许一些人在没有赋值权限的情况下循环遍历数据集合(尽管有删除的能力)。
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
看到Javadoc。
我将回答这个问题,特别是关于数组列表的例子,以便帮助你更好地理解。
可迭代接口强制其子类实现抽象方法'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”被引入是为了能够在foreach循环中使用。实现Iterable接口的类可以被迭代。
Iterator是在Iterable上管理迭代的类。它维护当前迭代中我们所处的状态,并知道下一个元素是什么以及如何获取它。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 在Python中获取迭代器中的元素个数
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder