迭代器是一種模式,它可以使得對於序列類型的資料結構的遍歷行為與被遍歷的物件分離,接下來透過本文給大家分享Java Iterator迭代器_動力節點Java學院整理,需要的朋友參考下吧
迭代器是一種模式,它可以使得對於序列類型的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。只要拿到這個物件,使用迭代器就可以遍歷這個物件的內部.
1.Iterator
Java提供一個專門的迭代器<
文件定義:
Package java.util; publicinterface Iterator<E> { boolean hasNext();//判断是否存在下一个对象元素 E next(); void remove(); } Package java.util; public interface Iterator<E> { boolean hasNext();//判断是否存在下一个对象元素 E next(); void remove(); }
2. Iterable
Java中也提供了一個Iterable接口,Iterable接口實現後的功能是「返回」一個迭代器,我們常用的實現了該接口的子接口有: Collection< E>, Deque
Iterable介麵包含一個能夠產生Iterator的iterator()方法,而Iterable介面被foreach用來在序列中移動。因此如果創建了任何實作Iterable介面的類,都可以將它用於foreach語句中。
文件定義:
Package java.lang; import java.util.Iterator; public interface Iterable<T> { Iterator<T> iterator(); }
文件定義:
Package java.lang; import java.util.Iterator; public interface Iterable<T> { Iterator<T> iterator(); }
使用Iterator的簡單範例
import java.util.*; publicclass TestIterator { public static void main(String[] args) { List list=new ArrayList(); Map map=new HashMap(); for(int i=0;i<10;i++){ list.add(new String("list"+i) ); map.put(i, new String("map"+i)); } Iterator iterList= list.iterator();//List接口实现了Iterable接口 while(iterList.hasNext()){ String strList=(String)iterList.next(); System.out.println(strList.toString()); } Iterator iterMap=map.entrySet().iterator(); while(iterMap.hasNext()){ Map.Entry strMap=(Map.Entry)iterMap.next(); System.out.println(strMap.getValue()); } } }
使用Iterator的簡單範例 ##
import java.util.*; public class TestIterator { public static void main(String[] args) { List list=new ArrayList(); Map map=new HashMap(); for(int i=0;i<10;i++){ list.add(new String("list"+i) ); map.put(i, new String("map"+i)); } Iterator iterList= list.iterator();//List接口实现了Iterable接口 while(iterList.hasNext()){ String strList=(String)iterList.next(); System.out.println(strList.toString()); } Iterator iterMap=map.entrySet().iterator(); while(iterMap.hasNext()){ Map.Entry strMap=(Map.Entry)iterMap.next(); System.out.println(strMap.getValue()); } } }
3. Iterator與泛型搭配
Iterator對集合類別中的任何一個實作類,都可以傳回這樣一個Iterator物件。可以適用於任何一個類別。Object類別類型,用時都需要進行強制轉換,這樣會很麻煩,用上泛型,就是提前告訴集合確定要裝入集合的類型,這樣就可以直接使用而不用顯示類型轉換.非常方便.
4.foreach和Iterator的關係
for each是jdk5.0新增加上的一個迴圈結構,可以用來處理集合中的每個元素而不用考慮集合定下標。 格式如下
for(variable:collection){ statement; }
變數用於暫存集合中的每一個元素,並執行對應的語句(區塊)。 collection必須是一個陣列或是實作了lterable介面的類別物件。
import java.util.*; public class TestIterator { public static void main(String[] args) { List<String> list=new ArrayList<String> (); for(int i=0;i<10;i++){ list.add(new String("list"+i) ); } for(String str:list){ System.out.println(str); } }
import java.util.*; public class TestIterator { public static void main(String[] args) { List<String> list=new ArrayList<String> (); for(int i=0;i<10;i++){ list.add(new String("list"+i) ); } for(String str:list){ System.out.println(str); } }
List list = new ArrayList(); list.add(...); list.remove(...);
但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。
4 使用for循环与使用迭代器iterator的对比
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.
【相关推荐】
1. Java免费视频教程
2. YMP在线手册
3. JAVA初级入门视频教程
以上是關於Iterator迭代器的詳細教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!