當咱們想要遍歷集合時,Java爲咱們提供了多種選擇,一般有如下三種寫法:java
for (int i = 0, len = strings.size(); i < len; i++) { System.out.println(strings.get(i)); }
for (String var : strings) { System.out.println(var); }
Iterator iterator = strings.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
那麼以上三種遍歷方式有何區別呢?for循環咱們很熟悉了,就是根據下標來獲取元素,這個特性與數組十分吻合,不熟悉的朋友能夠閱讀前面講解數組的文章。foreach則主要對相似鏈表的結構提供遍歷支持,鏈表沒有下標,因此使用for循環遍歷會大大下降性能。Iterator就是咱們今天要講述的主角,它實際上就是foreach。數組
那麼,爲何集合能夠進行foreach遍歷,而咱們本身定義的Java對象卻不能夠呢?有沒有辦法讓任何對象都支持這種遍歷方式?下面的內容會告訴咱們答案。數據結構
Iterable是迭代器的意思,做用是爲集合類提供for-each循環的支持。因爲使用for循環須要經過位置獲取元素,而這種獲取方式僅有數組支持,其餘許多數據結構,好比鏈表,只能經過查詢獲取數據,這會大大的下降效率。Iterable就可讓不一樣的集合類本身提供遍歷的最佳方式。oop
Iterable的文檔聲明僅有一句:性能
Implementing this interface allows an object to be the target of the "for-each loop" statement.學習
它的做用就是爲Java對象提供foreach循環,其主要方法是返回一個Iterator
對象:this
Iterator<T> iterator();
也就是說,若是想讓一個Java對象支持foreach,只要實現Iterable接口,而後就能夠像集合那樣,經過Iterator iterator = strings.iterator()
方式,或者使用foreach,進行遍歷了。code
Iterator是foreach遍歷的主體,它的代碼實現以下:對象
// 判斷一個對象集合是否還有下一個元素 boolean hasNext(); // 獲取下一個元素 E next(); // 刪除最後一個元素。默認是不支持的,由於在不少狀況下其結果不可預測,好比數據集合在此時被修改 default void remove(){...} // 主要將每一個元素做爲參數發給action來執行特定操做 default void forEachRemaining(Consumer<? super E> action){...}
Iterator
還有一個子接口,是爲須要雙向遍歷數據時準備的,在後續分析ArrayList
和LinkedList
時都會看到它。它主要增長了如下幾個方法:blog
// 是否有前一個元素 boolean hasPrevious(); // 獲取前一個元素 E previous(); // 獲取下一個元素的位置 int nextIndex(); // 獲取前一個元素的位置 int previousIndex(); // 添加一個元素 void add(E e); // 替換當前元素值 void set(E e);
在Java中有許多特性都是經過接口來實現的,foreach循環也是。foreach主要是解決for循環依賴下標的問題,爲高效遍歷更多的數據結構提供了支持。若是你清楚數組和鏈表的區別,應該就能夠回答如下問題了:
for與foreach有何區別,哪一個更高效?
【感謝您能看完,若是可以幫到您,麻煩點個贊~】
更多經驗技術歡迎前來共同窗習交流: 一點課堂-爲夢想而奮鬥的在線學習平臺 http://www.yidiankt.com/
![關注公衆號,回覆「1」免費領取-【java核心知識點】]
QQ討論羣:616683098
QQ:3184402434
想要深刻學習的同窗們能夠加我QQ一塊兒學習討論~還有全套資源分享,經驗探討,等你哦!