我是Java的新手,我真的很困惑迭代器和可迭代器。谁能给我解释一下并举几个例子吗?
当前回答
大多数java接口以“able”结尾。例如可迭代的、可克隆的、可序列化的、可运行的等等。因此,Iterable是一个接口,它有一个名为iterator()的抽象方法,该方法返回一个iterator对象。
public interface Iterable {
abstract Iterator<T> iterator();
}
迭代器接口有抽象方法“hasNext()”和“next()”。
public interface Iterator {
abstract boolean hasNext();
abstract E next();
}
一个明确的使用是List扩展->Collections Interface->扩展Iterable
List<String> countrylist = new ArrayList<>();
list.add("US");
list.add("China");
list.add("Japan");
list.add("India");
Iterator<String> it = countrylist.iterator();
while (it.hasNext()) {
String string = it.next();
System.out.println(string);
}
其他回答
问:Iterable和Iterator的区别? 答:
iterable:它与forEach循环相关 iterator: Is与Collection相关
forEach循环的目标元素应该是可迭代的。 我们可以使用Iterator从集合中逐个获取对象
java中存在可迭代对象。ḷang包 java中的迭代器。util包
只包含一个方法迭代器() 包含三个方法hasNext(), next(), remove()
1.5版引入 1.2版引入
最重要的考虑是所讨论的项是否应该能够多次遍历。这是因为你总是可以通过再次调用iterator()来倒带一个Iterable,但是没有办法倒带一个iterator。
我将回答这个问题,特别是关于数组列表的例子,以便帮助你更好地理解。
可迭代接口强制其子类实现抽象方法'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语句的目标。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
Iterator是一个接口,它具有迭代元素的实现。Iterable是一个提供迭代器的接口。
假设有10个苹果。 当它实现Iterable时,就像把每个苹果放在从1到10的盒子里,并返回一个可用于导航的迭代器。
通过实现迭代器,我们可以得到任何apple, apple in next boxes等等。
实现iterable提供了一个迭代器来导航它的元素,尽管要导航,迭代器需要被实现。
推荐文章
- Java中对象的内存消耗是多少?
- 获取Spring应用程序背景信息
- 为什么在Java中使用静态嵌套接口?
- @Mock, @MockBean和Mockito.mock()的区别
- JDK 8中的PermGen消除
- 如何将CharSequence转换为字符串?
- 在Java中初始化一个long
- Java的数组indexOf在哪里?
- 同一个键下的多个值
- Java“虚拟机”vs. Python“解释器”的说法?
- 获取操作系统级别的系统信息
- 如何通过SFTP从服务器检索文件?
- Intellij错误地表示没有为自动连接存储库找到类型的bean
- Android构建脚本库:jcenter VS mavencentral
- 为什么我应该使用Deque而不是Stack?