Iterable接口是Java集合框架的頂級接口,實現此接口使集合對象可以通過迭代器遍歷自身元素。
查看源碼
package java.lang;
import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
public interface Iterable<T> {
// 返回一個內部元素為T類型的順序迭代器
Iterator<T> iterator();
// 對Iterable中的元素進行指定的操作
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
// 返回一個內部元素為T類型的並行迭代器
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
總結
后兩個方法是Java8后新添加的,forEach()方法是為了方便遍歷並操作集合內的元素。spliterator()方法則提供了一個可以並行遍歷元素的迭代器,以適應現在cpu多核時代並行遍歷的需求。其中我們可以看下default修飾符,這也是Java8后新出現的。我們知道,如果我們給一個接口新添加一個方法,那么所有他的具體子類都必須實現此方法。為了能給接口拓展新功能,而又不必每個子類都要實現此方法,因此Java8新加了default關鍵字,被其修飾的方法可以不必由子類實現,並且由dafault修飾的方法在接口中有方法體,這打破了Java之前對接口方法的規范。
進行迭代遍歷的時候我們需要注意這種情況,就是在遍歷的過程中,如果我們對元素進行添加、刪除操作,那么會造成並行修改異常。對於這種情況,我們應當使用迭代器Iterator內部的remove()方法,而不是使用集合list直接刪除元素。
自定義集合
import java.util.Iterator;
public class MyCollection<E> implements Iterable<E> {
@SuppressWarnings("unchecked")
@Override
public Iterator iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator<E>{
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
return null;
}
}
}