Answers:
我将以示例的形式回答有关ArrayList的问题,以帮助您更好地理解..
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
public interface Iterator { ... abstract boolean hasNext(); //Returns true if the iteration has more elements. abstract E next(); //Returns the next element in the iteration. ... }
'可迭代<-集合<-列表<-ArrayList'
。Iterable,Collection和List仅声明抽象方法“ iterator()”,而ArrayList单独实现它。
“ iterator()”方法返回实现“ Iterator”的类“ Itr”的对象。
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);
}
}
现在清楚了吗?:)
Iterable<T>
在这种情况下的方法,那我们需要执行哪些步骤呢?请也建议该示例。
如果一个集合是可迭代的,则可以使用迭代器对其进行迭代(因此可以在每个循环中使用它。)迭代器是将迭代整个集合的实际对象。
java.lang.Iterable
吗
java.lang.Iterable
实现Iterable接口允许对象成为“ foreach”语句的目标。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
迭代器是一个接口,具有用于迭代元素的实现。Iterable是提供Iterator的接口。
最重要的考虑因素是所讨论的项目是否应该能够被多次遍历。这是因为您始终可以通过再次调用iterator()来回退Iterable,但是无法回退Iterator。
考虑一个有10个苹果的例子。当它实现Iterable时,就像将每个苹果放在1到10的盒子中并返回一个可用于导航的迭代器一样。
通过实现迭代器,我们可以获取任何苹果,下一盒苹果等。
因此,实现iterable使迭代器可以导航其元素,尽管要导航,则需要实现迭代器。
基本上,两者彼此之间有着非常紧密的联系。
将Iterator视为一个接口,可以借助一些未定义的方法(例如hasNext(),next()和remove())帮助我们遍历集合。
另一方面,Iterable是另一个接口,如果由类实现,则该接口将强制该类为Iterable,并且是For-Each构造的目标。它只有一个名为iterator()的方法,该方法来自Iterator接口本身。
如果集合是可迭代的,则可以使用迭代器对其进行迭代。
要了解,请访问以下网址:
ITERABLE: http ://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java
实验者 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java
简单来说,Iterable和Iterator都是Java的Collection Framework中提供的接口。
可迭代的
如果一个类希望有一个for-each循环来迭代其集合,则必须实现Iterable接口。但是,for-each循环只能用于向前循环浏览集合,而您将无法修改该集合中的元素。但是,如果您只想读取元素数据,那么它非常简单,而且由于使用Java lambda表达式,它通常只是一个衬里。例如:
iterableElements.forEach (x -> System.out.println(x) );
迭代器
该接口使您可以遍历集合,获取和删除其元素。每个集合类都提供一个iterator()方法,该方法将迭代器返回到集合的开头。该接口优于可迭代的优点是,使用此接口可以添加,修改或删除集合中的元素。但是,访问元素需要比可迭代更多的代码。例如:
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
资料来源:
Iterable
被介绍用于Java中的每个循环
public interface Collection<E> extends Iterable<E>
Iterator
是管理上的迭代的类Iterable
。它保持我们在当前迭代中的位置的状态,并且知道下一个元素是什么以及如何获取它。
Iterable
拥有hasinteral
或external
iterator,或者可能拥有其中任何一个,那会很重要吗?