摘要:具體原因在后面說明是必須實現的接口,返回了一個迭代器。迭代器,可以對已知集合進行遍歷操作。這里可以看出,循環最終其實是會使用方法獲取迭代器,來完成遍歷。
概述
迭代器,提供了在不了解集合內部實現方法的時候遍歷集合的能力。可以將容器內部實現與遍歷操作隔離、解耦。
使用迭代器實現一個簡單集合通過自定義一個簡單集合,并在對其使用迭代器進行遍歷,達到掌握迭代器的目的。
集合描述一個簡單的集合,規則如下
1、只能存放三個字符串
2、若插入第四個數據,則覆蓋第一個位置。
實現接口描述 Iterable接口描述如果想用foreach對集合遍歷,則必須實現該接口。(具體原因在后面說明)
iterator():是必須實現的接口,返回了一個迭代器。
Iterator迭代器,可以對已知集合進行遍歷操作。
hasNext():必須實現,返回一個boolean表示是否有下一個值
next():必須實現,從集合中返回下一個元素。
代碼實現 自定義集合/** * 自定義集合 * 功能: 只能插入三個元素, 插入第四個元素會替換集合中第一個元素 * 實現了Iterable(可迭代)接口,必須要實現其中的iterator方法,返回一個迭代器 **/ public class MyCollection implements Iterable自定義迭代器{ String value1; String value2; String value3; int currentValueIndex = 1; public String get(int index) { switch (index) { case 1: return value1; case 2: return value2; case 3: return value3; default: return null; } } /** * 添加一個元素, currentValueIndex為當前元素索引, 表示下一次插入的位置 * 維護了一個只可以插入三個String的集合 * @param value * @return */ public boolean add(String value) { switch (currentValueIndex) { case 1: value1 = value; currentValueIndex++; break; case 2: value2 = value; currentValueIndex++; break; case 3: value3 = value; currentValueIndex-=2; break; default: break; } return true; } /** * 返回我們自己定義的集合迭代器 * @return */ @Override public Iterator iterator() { return new MyCollectionIterator(this); } }
自定義了一個迭代器,可以對上面自定義集合進行遍歷。
/** * 給我自己實現的集合實現一個迭代器 * 必須實現的方法 * hasNext是否有下一個元素 * next取出下一個元素 */ public class MyCollectionIterator implements Iterator測試方法{ int index = 1; int maxIndex = 3; MyCollection myCollection; public MyCollectionIterator(MyCollection myCollection) { this.myCollection = myCollection; } /** * 如果當前指針已經指向3,就沒有下一個了,返回false * 否則還有下一個 * @return */ @Override public boolean hasNext() { if (index > maxIndex) { return false; } return true; } /** * 取出下一個元素,指針向前移動一步 * @return */ @Override public String next() { String result = myCollection.get(index); index ++; return result; } }
public class Test { public static void main(String[] args) { MyCollection collection = new MyCollection(); collection.add("test1"); collection.add("test2"); collection.add("test3"); /** * 循環1,獲取MyCollection的迭代器, 用while和next、hasNext遍歷我們的自定義集合 */ Iterator測試代碼反編譯結果iterator = collection.iterator(); while (iterator.hasNext()) { String str = iterator.next(); System.out.println(str); } /** * 循環2,因為我們的集合實現了Iterable接口,因此可以使用forEach循環 * 但是foreach循環編譯的結果是和循環1一模一樣的代碼 */ for (String s : collection) { System.out.println(s); } } }
這里是上述測試代碼反編譯后的代碼,可以看到,上面的循環2(foreach),已經被編譯成了和循環1一樣的結構。這里可以看出,foreach循環最終其實是會使用iterator()方法獲取迭代器,來完成遍歷。因此如果想使用foreach循環,則必須實現Iterable接口。
public class Test { public Test() { } public static void main(String[] args) { MyCollection collection = new MyCollection(); collection.add("test1"); collection.add("test2"); collection.add("test3"); Iterator iterator = collection.iterator(); while(iterator.hasNext()) { String str = (String)iterator.next(); System.out.println(str); } Iterator var5 = collection.iterator(); while(var5.hasNext()) { String s = (String)var5.next(); System.out.println(s); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74289.html
摘要:理解迭代對象迭代器生成器后端掘金本文源自作者的一篇博文,原文是,俺寫的這篇文章是按照自己的理解做的參考翻譯。比較的是兩個對象的內容是后端掘金黑魔法之協程異步后端掘金本文為作者原創,轉載請先與作者聯系。 完全理解關鍵字with與上下文管理器 - 掘金如果你有閱讀源碼的習慣,可能會看到一些優秀的代碼經常出現帶有 with 關鍵字的語句,它通常用在什么場景呢?今天就來說說 with 和 上下...
摘要:前言本篇主要講解中的機制和網絡通訊中處理高并發的分為兩塊第一塊講解多線程下的機制第二塊講解如何在機制下優化資源的浪費服務器單線程下的機制就不用我介紹了,不懂得可以去查閱下資料那么多線程下,如果進行套接字的使用呢我們使用最簡單的服務器來幫助大 前言 本篇主要講解Java中的IO機制和網絡通訊中處理高并發的NIO 分為兩塊:第一塊講解多線程下的IO機制第二塊講解如何在IO機制下優化CPU資...
摘要:比如,第一張圖中,如果傳入的參數為,那就可以找出所有為的數據了,放入迭代器里。每次小的遍歷結束是,迭代器,表示繼續訪問迭代器中的下一行。 上一章我們學習了對智能合約開發來說至關重要的第一步: 知道了RAM、multi_index和EOS數據庫各是什么以及它們之間的關系; 知道了multi_index是內存數據庫的入口; 了解了multi_index內部的結構長什么樣子; 今天這...
閱讀 2650·2021-11-25 09:43
閱讀 670·2021-11-12 10:36
閱讀 4615·2021-11-08 13:18
閱讀 2168·2021-09-06 15:00
閱讀 3106·2019-08-30 15:56
閱讀 924·2019-08-30 13:57
閱讀 1985·2019-08-30 13:48
閱讀 1413·2019-08-30 11:13