Java 迭代器和iterable之间的区别是什么?如何使用它们?
我是Java新手,对迭代器和iterable很困惑。有人能给我解释一下并给出一些例子吗?如果集合是可迭代的,那么它可以使用迭代器进行迭代(因此可以在for-each循环中使用)迭代器是将在集合中进行迭代的实际对象。Iterable是一系列可以迭代的元素的简单表示。它没有任何迭代状态,例如“当前元素”。相反,它有一个方法生成一个Java 迭代器和iterable之间的区别是什么?如何使用它们?,java,iterator,iterable,Java,Iterator,Iterable,我是Java新手,对迭代器和iterable很困惑。有人能给我解释一下并给出一些例子吗?如果集合是可迭代的,那么它可以使用迭代器进行迭代(因此可以在for-each循环中使用)迭代器是将在集合中进行迭代的实际对象。Iterable是一系列可以迭代的元素的简单表示。它没有任何迭代状态,例如“当前元素”。相反,它有一个方法生成一个迭代器 迭代器是具有迭代状态的对象。它允许您使用hasNext()检查它是否有更多元素,并使用next()移动到下一个元素(如果有) 通常,Iterable应该能够生成任意
迭代器
迭代器是具有迭代状态的对象。它允许您使用hasNext()
检查它是否有更多元素,并使用next()
移动到下一个元素(如果有)
通常,Iterable
应该能够生成任意数量的有效的迭代器。Iterable
的实现是一个提供自身的迭代器的实现:
public interface Iterable<T>
{
Iterator<T> iterator();
}
公共接口不可编辑
{
迭代器迭代器();
}
迭代器是一种简单的方法,它允许一些人在没有分配权限的情况下(尽管能够删除)遍历数据集合
公共接口迭代器
{
布尔hasNext();
E next();
无效删除();
}
请参阅。实现Iterable接口允许对象成为“foreach”语句的目标
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
class SomeClass实现了Iterable{}
班长
{
公开作废法()
{
SomeClass SomeClass=新的SomeClass();
.....
for(字符串s:someClass){
//做点什么
}
}
}
迭代器是一个接口,它具有对元素进行迭代的实现。Iterable是一个提供迭代器的接口。最重要的考虑因素是相关项是否能够被多次遍历。这是因为您始终可以通过再次调用iterator()来回放Iterable,但无法回放迭代器。问题:Iterable和iterator之间的区别
答复:
iterable:它与forEach循环相关
迭代器:与集合相关
forEach循环的目标元素应该是iterable
我们可以使用迭代器从集合中逐个获取对象
Iterable存在于java中。ḷang软件包
java.util包中存在迭代器
仅包含一个方法迭代器()
包含三个方法hasNext()、next()、remove()
在1.5版本中引入
在1.2版中引入,除了和答案。
简单来说,Iterable和Iterator都是Java集合框架中提供的接口
Iterable
如果一个类想要有一个for-each循环来迭代它的集合,那么它必须实现Iterable接口。但是,for each循环只能用于正向循环遍历集合,您将无法修改此集合中的元素。但是,如果您只想读取元素数据,那么它非常简单,而且由于Java lambda表达式,它通常是一行。例如:
iterableElements.forEach (x -> System.out.println(x) );
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
迭代器
此接口使您能够遍历集合,获取并删除其元素。每个集合类都提供了一个迭代器()方法,该方法将迭代器返回到集合的开头。与iterable相比,此接口的优点是,使用此接口可以添加、修改或删除集合中的元素。但是,访问元素需要比iterable多一点的代码。例如:
iterableElements.forEach (x -> System.out.println(x) );
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
来源:
从根本上说,两者之间的关系非常密切
将迭代器看作是一个接口,它可以帮助我们借助一些未定义的方法(如hasNext()、next()和remove()遍历集合
另一方面,Iterable是另一个接口,如果由类实现,则该接口将强制该类为Iterable,并且是每个构造的目标。
它只有一个名为iterator()的方法,该方法来自iterator接口本身
如果集合是可迭代的,则可以使用迭代器对其进行迭代
要了解这些信息,请访问:
ITERABLE:
迭代器考虑一个有10个苹果的示例。
当它实现Iterable时,就像将每个苹果放在1到10之间的框中,然后返回一个迭代器,该迭代器可用于导航
通过实现迭代器,我们可以得到任何苹果、下一个盒子中的苹果等
因此,实现iterable使迭代器能够导航其元素,尽管要导航,需要实现迭代器。如前所述,引入“iterable”是为了能够在foreach
循环中使用。可以迭代实现Iterable接口的类
迭代器是在一个Iterable上管理迭代的类。它保持我们在当前迭代中的状态,并知道下一个元素是什么以及如何获得它。我将以ArrayList为例回答这个问题,以帮助您更好地理解
Iterable接口强制其子类实现抽象方法“iterator()”
ArrayList实现列表、列表扩展集合和集合扩展Iterable。。
也就是说,你可以看到这样的关系
“IterableIterable
被引入java中的for-each循环中
public interface Collection<E> extends Iterable<E>
公共接口集合扩展了Iterable
Iterator
是在Iterable
上管理迭代的类。它保持我们在当前迭代中的状态,并知道
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];
}
...
}
}
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);
}
}
public interface Collection<E> extends Iterable<E>