java迭代子形式詳解。本站提示廣大學習愛好者:(java迭代子形式詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java迭代子形式詳解正文
迭代子(Iterator)形式的構造:
迭代子形式可以次序拜訪一個集合中的元素而不用裸露集合的外部表象。
迭代子可分為外禀迭代子和內禀迭代子。
外禀迭代子:合適於白箱集合(白箱集合就是向外界供給拜訪本身外部元素接口的集合),因為迭代的邏輯是由集合對象自己供給的,所以如許的外禀迭代子腳色常常僅僅堅持迭代的游標地位。所以詳細迭代子腳色是一個內部類,它的結構函數接收一個詳細集合對象,從而可以挪用這個集合對象的迭代邏輯。
內禀迭代子:實用於黑箱集合(黑箱集合不向內部供給遍歷本身元素對象的接口),因為黑箱集合的元素對象只可以被集合外部成員拜訪,所之內禀迭代子只能是集合外部的成員子類。
簡略示范:
package test.edu.inter; public interface IteratorObj { /** * 挪動到第一個元素 */ public void first(); /** * 挪動到下一個元素 */ public boolean hasNextItem(); /** * 返還以後元素 */ public Object currentItem(); } package test.edu.inter; public interface DataSet { public IteratorObj getIterator(); } package test.edu.inter; public class Iterator1 implements IteratorObj { private Dataobj set; private int size; private int index=0; public Iterator1(Dataobj set){ this.set = set; this.size = set.getSize(); } @Override public void first() { // TODO Auto-generated method stub this.index = 0; } @Override public boolean hasNextItem() { if(index<size){ return true; } return false; } @Override public Object currentItem() { Object ob = set.getItem(index); if(index<size){ index++; } return ob; } } package test.edu.inter; public class Dataobj implements DataSet { private Object[] objArray = null; /** * 傳入聚合對象 */ public Dataobj(Object[] objArray){ this.objArray = objArray; } @Override public IteratorObj getIterator() { return new Iterator1(this); } public Object getItem(int index){ return objArray[index]; } public int getSize(){ return objArray.length; } } package test.edu.inter; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String[] str={"12312","dasda","dasd","12d","asd"}; Dataobj ao = new Dataobj(str); IteratorObj io = ao.getIterator(); while(io.hasNextItem()){ System.out.println(io.currentItem()); } } }
運轉成果:
12312 dasda dasd 12d asd
內容擴大:在java集合中的運用
在java.util.Collection接口供給iterator()工場辦法前往一個Iterator類型對象,Collection接口的子類型AbstractList類的外部成員類Itr完成Iterator接口。所以Itr是內禀迭代子類,然則AbstractList也供給了本身的遍歷辦法,所以它不是黑箱集合,而是白箱集合。其代碼以下:
import java.util.Iterator; public interface Itr extends Iterator{ //再次挪用next()辦法時所用的目標 int cursor = 0; //比來一次挪用時所用的目標 int lastRet = -1; int expectedModCount = modCount; public boolean hasNext(){ return cursor!=size(); } public Object next(){ try{ Object next = get(cursor); checkForComodification(); lastRet = cursor++; return next; }catch(IndexOutOfBoundsException e){ checkForComodification(); throw new NoSuchElementException(); } } //刪除最初遍歷過的元素,remove()辦法只能刪除最初遍歷的元素 public void remove(){ if(lastRet ==-1) throw new IllegalStateException(); checkForComodification(); try{ AbstractList.this.remove(lastRet); if(lastRet<cursor) cursor--; lastRet = -1; expectedModCount = modCount; }catch(IndexOutOfBoundsException e){ throw new ConcurrentModificationException(); } } public void checkForComodification(){ if(modCount!=expectedModCount) throw new ConcurrentModificationException(); } }
個中的modCount、get(cursor)等變量和辦法均是AbstractList類所具有,Itr可以直接應用。辦法checkForComodification()會檢討集合的內容能否方才被外界直接修正過(不是經由過程迭代子供給的remove()辦法修正的)。假如在迭代子開端後,集合的內容被外界繞過迭代子對象而直接修正過年話,這個辦法立刻拋出異常。
別的:AbstractList類也供給了listIterator()辦法,前往一個完成了Listiterator接口的類ListItr實例。ListIterator接話柄現了正向迭代和逆向迭代,同時還供給了在迭代進程傍邊平安修正列的內容的辦法。
Enumeration與Iterator的差別:(1)Enumeration沒有remove辦法(2)Enumeration是在Vector中的element()辦法中感化一個無名類完成的,它不付出Fail Fast,也就是說在迭代進程中,集合對象被外界不測直接修正,則這個迭代進程還會立刻捕捉任何異常。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。