<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Iterator
物件稱為迭代器(設計模式的一種),主要用於遍歷 Collection
集合中的元素。
GOF
給迭代器模式的定義為:提供一種方法存取一個容器(container
)物件中各個元素,而又不需暴露該物件的內部細節。迭代器模式,就是為容器而生。類似於“公交車上的售票員”、“火車上的乘務員”、“空姐”。
Collection
介面繼承了java.lang.Iterable
介面,該介面有一個iterator()
方法,那麼所有實現了Collection
介面的集合類都有一個iterator()
方法,用以返回一個實現了 Iterator
介面的物件。
Iterator
僅用於遍歷集合,Iterator
本身並不提供承裝物件的能力。如果需要建立 Iterator
物件,則必須有一個被迭代的集合。
集合物件每次呼叫iterator()
方法都得到一個全新的迭代器物件,預設遊標都在集合 的第一個元素之前。
注意:在呼叫it.next()
方法之前必須要呼叫it.hasNext()
進行檢測。若不呼叫,且下一條記錄無效,直接呼叫it.next()
會丟擲NoSuchElementException
異常。
//hasNext():判斷是否還有下一個元素 while(iterator.hasNext()){ //next():①指標下移 ②將下移以後集合位置上的元素返回 System.out.println(iterator.next()); }
當執行Iterator iterator = coll.iterator();
語句時,iterator
的指標此時執行下圖的①所標的位置,然後執行iterator.hasNext()
語句,此時會去判斷iterator
的指標指向的位置的下一個位置(即②)有無元素,若有,則返回true
,否則返回false
。當返回結果為true
時,則往下執行 iterator.next()
語句,此時iterator
的指標下移並且把下移後的指標指向的集合位置上的元素返回。
Iterator iter = coll.iterator();//回到起點 while(iter.hasNext()){ Object obj = iter.next(); if(obj.equals("Tom")){ iter.remove(); } }
Iterator
可以刪除集合的元素,但是是遍歷過程中通過迭代器物件的remove
方法,不是集合物件的remove
方法。
如果還未呼叫next()
或在上一次呼叫 next()
方法之後已經呼叫了 remove
方法,再呼叫remove
都會報IllegalStateException
異常。
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); Iterator iterator = coll.iterator(); //方式一: // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // //報異常:NoSuchElementException // System.out.println(iterator.next()); //方式二:不推薦 // for(int i = 0;i < coll.size();i++){ // System.out.println(iterator.next()); // } //方式三:推薦 hasNext():判斷是否還有下一個元素 while(iterator.hasNext()){ //next():①指標下移 ②將下移以後集合位置上的元素返回 System.out.println(iterator.next()); } }
@Test public void test2(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //錯誤方式一: // Iterator iterator = coll.iterator(); // while((iterator.next()) != null){ // System.out.println(iterator.next()); // } //錯誤方式二: //集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合的第一個元素之前。 while (coll.iterator().hasNext()){ System.out.println(coll.iterator().next()); } } //測試Iterator中的remove() //如果還未呼叫next()或在上一次呼叫 next 方法之後已經呼叫了 remove 方法, // 再呼叫remove都會報IllegalStateException。
@Test public void test3(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //刪除集合中"Tom" Iterator iterator = coll.iterator(); while (iterator.hasNext()){ // iterator.remove(); Object obj = iterator.next(); if("Tom".equals(obj)){ iterator.remove(); // iterator.remove(); } } //遍歷集合 iterator = coll.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } }
Java 5.0
提供了 foreach
迴圈迭代存取 Collection
和陣列。
遍歷操作不需獲取Collection
或陣列的長度,無需使用索引存取元素。
遍歷集合的底層呼叫Iterator
完成操作。
foreach
還可以用來遍歷陣列。
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //for(集合元素的型別 區域性變數 : 集合物件) //內部仍然呼叫了迭代器。 for(Object obj : coll){ System.out.println(obj); } //123 //456 //Person@621be5d1 //Tom //false }
@Test public void test2(){ int[] arr = new int[]{1,2,3,4,5,6}; //for(陣列元素的型別 區域性變數 : 陣列物件) for(int i : arr){ System.out.println(i); } //1 //2 //3 //4 //5 //6 }
public class test { public static void main(String[] args) { String[] str = new String[5]; for (String myStr : str) { myStr = "小老師ir"; System.out.println(myStr); } //小老師ir //小老師ir //小老師ir //小老師ir //小老師ir for (int i = 0; i < str.length; i++) { System.out.println(str[i]); } //null //null //null //null //null } }
到此這篇關於Java深入分析Iterator迭代器與foreach迴圈的使用的文章就介紹到這了,更多相關Java Iterator迭代器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45