<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
所謂迭代的意思就是交換替代,迭代器並不是一種資料結構或者集合,而是可以過迭代器中的方法逐個存取集合中的每個元素的一種方法。提到迭代器最重要的就是Iterator介面,所有想要使用迭代器迭代的結構都需要實現或者繼承這個介面
Iterator介面包含4個方法,分別是next、hasNext、remove、forEachRemaining,接下來在學習構造器如何使用之前我們先學習一下它的四種方法
首先一開始構造器中的有一個類似於指標的標誌,指在集合中第一個元素的前面,呼叫構器中的next方法會使這個"指標"的位置後移到第一和二個元素之間,然後返回它跨過的那個元素給構造器,也就是第一個元素,如果"指標"到最後一個元素後面再呼叫next方法的話就會導致丟擲NoSuchElementException
remove方法則是刪除當前元素,可以理解為next方法返回的那個元素,如果呼叫remove方法之前沒有呼叫next方法或者是使用remove方法刪除該元素之後都會導致構造器為空,此時呼叫remove方法就會導致程式丟擲IllegalStateExceptions異常
hasNext方法就是判斷迭代器是否還有可迭代的下一個元素,如果有的話就返回true否則返回false,為了避免上述兩種異常,remove方法每次都要配合另外兩種方法一起使用,每次呼叫next方法之前都使用hasNext方法判斷一下,避免沒有可迭代元素導致的異常,每一次呼叫remove之前都使用next方法獲得元素,避免迭代器為空導致的狀態異常
forEachRemaining方法則可以直接遍歷迭代器中的每一個元素並呼叫方法引數中的Lambda表示式,直到迭代器將集合的元素全部迭代完為止
接下來將結合上面的描述給出一個將集合中的元素全部刪除的標準程式碼,然後再給出兩個錯誤的程式碼,大家可以在使用迭代器的時候規避一下
正確寫法
// 建立一個ArrayList集合 Collection<String> strings = new ArrayList<>(); strings.add("a"); strings.add("b"); strings.add("c"); strings.add("d"); // 獲得迭代器物件 Iterator<String> iterator = strings.iterator(); // 使用while迴圈迭代集合中元素 使用hasNext方法判斷 while (iterator.hasNext()) { // 使用next獲取下一個元素 iterator.next(); // 刪除這個元素 iterator.remove(); // 列印集合中元素 System.out.println(strings); }
錯誤示範一
// 建立一個ArrayList集合 Collection<String> strings = new ArrayList<>(); strings.add("a"); strings.add("b"); strings.add("c"); strings.add("d"); // 獲得迭代器 Iterator<String> iterator = strings.iterator(); // 使用while迴圈迭代集合中元素 使用next方法判斷下一個元素是否為空 while (iterator.next() != null) { // 輸出這個元素 System.out.println(iterator.next()); }
第一個的錯誤原因:使用next方法判斷下一個元素是否為空,這樣就會導致"指標"到最後一個元素後面依舊會執行next方法,這樣就會導致丟擲NoSuchElementException異常;而且next方法每呼叫一次都會將"指標"向後移動一位,哪怕只是用於if判斷。所以程式就會每隔一個元素輸出一次,最後丟擲NoSuchElementException異常
錯誤示範二
// 建立一個ArrayList集合 Collection<String> strings = new ArrayList<>(); strings.add("a"); strings.add("b"); strings.add("c"); strings.add("d"); // 獲取迭代器物件 並使用while迴圈迭代集合中元素 使用hasNext方法判斷 while (strings.iterator().hasNext()) { // 獲取迭代器物件 並使用next獲取下一個元素 然後輸出 System.out.println(strings.iterator().next()); }
第二個的錯誤原因:每使用iterator方法獲得一次集合對應的迭代器物件,都會預設將"指標"放到第一個元素的前面,於是第二個錯誤示範中一直使用集合中的第一個元素"a"進行判斷有沒有下一個元素,所以會導致程式陷入死迴圈,迴圈體裡也會一直建立結合的迭代器物件,並將"指標"放到第一個元素的前面,然後呼叫next方法輸出元素"a"
集合大體上可以分為兩種,一種是單列的Collection集合,一種就是雙列的Map集合,所謂的單雙列可以理解為元素中資料的個數,單列集合一個資料作為元素儲存,雙列集合兩個具有對映關係的資料作為元素儲存。這一篇我們先學習Collection集合介面的內容,Collection集合按照元素儲存是否有序又可分為List集合、Set集合
前面之所以先學習Iterator介面的原因就是,Collection介面繼承了Iteator介面,於是它的子介面set和list都可以使用迭代器對集合中的元素進行迭代
在學習集合之前,我們將儲存多個物件或者元素的任務都交給了陣列,但是陣列儲存元素有以下缺點:
①陣列一旦初始化之後,長度就確定不可修改,元素個數超出陣列長度的話會拋異常。
②陣列中提供的API很少,增加元素需要現將索引後的元素後移空出位置將元素新增進去,刪除元素需要刪除之後將後面的元素前移將空出來的位置補足,以上操作只能通過程式碼實現並沒有現成的API可以使用。
③陣列儲存資料的特點:有序、可重複,對於一些無需、不可重複的業務需求就很難滿足
集合就可以很好的彌補陣列的上述缺點,而且集合提供了一組較為完善的資料結構,我們可以根據具體的業務需求來選擇具體使用的集合型別。比如說儲存元素無序不可重複的Set集合,有序可重複的List集合,具有對映關係的Map集合等
以上給出的Collection介面中的API都是抽象方法,也就意味著每一個此介面的實現類都需要重寫這些抽象方法,實際上Collection介面的直接或者間接實現類有很多,如果每一個都需要重寫這些方法的話就會很是麻煩。於是Java類庫的設計者提供了AbstractCollection類,該類中只將size方法和Iterator方法宣告為抽象,其他方法都提供了預設實現,如果子類不提供這些方法的方法體的話就使用該類中的預設實現
下圖可知,list、set集合的實現類都直接或者間接的繼承了AbstractCollection類,為的就是簡化重寫Collection介面的抽象方法
到此這篇關於Java迭代器與Collection介面超詳細講解的文章就介紹到這了,更多相關Java迭代器與Collection介面內容請搜尋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