最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java迭代器與Collection接口超詳細講解

 更新時間:2022年07月19日 10:08:09   作者:扎哇太棗糕  
Collection也稱集合,集合概述:集合是Java中提供的一種容器,可以用來存儲多個數據。Iterator(迭代器)不是一個集合,它是一種用于訪問集合的方法,可用于迭代 ArrayList 和 HashSet 等集合

關于迭代器你都知道什么?

什么是迭代器?

  所謂迭代的意思就是交換替代,迭代器并不是一種數據結構或者集合,而是可以過迭代器中的方法逐個訪問集合中的每個元素的一種方法。提到迭代器最重要的就是Iterator接口,所有想要使用迭代器迭代的結構都需要實現或者繼承這個接口

迭代器的4個API

  Iterator接口包含4個方法,分別是next、hasNext、remove、forEachRemaining,接下來在學習構造器如何使用之前我們先學習一下它的四種方法

  首先一開始構造器中的有一個類似于指針的標志,指在集合中第一個元素的前面,調用構器中的next方法會使這個"指針"的位置后移到第一和二個元素之間,然后返回它跨過的那個元素給構造器,也就是第一個元素,如果"指針"到最后一個元素后面再調用next方法的話就會導致拋出NoSuchElementException

  remove方法則是刪除當前元素,可以理解為next方法返回的那個元素,如果調用remove方法之前沒有調用next方法或者是使用remove方法刪除該元素之后都會導致構造器為空,此時調用remove方法就會導致程序拋出IllegalStateExceptions異常

  hasNext方法就是判斷迭代器是否還有可迭代的下一個元素,如果有的話就返回true否則返回false,為了避免上述兩種異常,remove方法每次都要配合另外兩種方法一起使用,每次調用next方法之前都使用hasNext方法判斷一下,避免沒有可迭代元素導致的異常,每一次調用remove之前都使用next方法獲得元素,避免迭代器為空導致的狀態(tài)異常

  forEachRemaining方法則可以直接遍歷迭代器中的每一個元素并調用方法參數中的Lambda表達式,直到迭代器將集合的元素全部迭代完為止

如何使用迭代器?

  接下來將結合上面的描述給出一個將集合中的元素全部刪除的標準代碼,然后再給出兩個錯誤的代碼,大家可以在使用迭代器的時候規(guī)避一下

正確寫法

// 創(chuàng)建一個ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
// 獲得迭代器對象
Iterator<String> iterator = strings.iterator();
// 使用while循環(huán)迭代集合中元素 使用hasNext方法判斷
while (iterator.hasNext()) {
    // 使用next獲取下一個元素
    iterator.next();
    // 刪除這個元素
    iterator.remove();
    // 打印集合中元素
    System.out.println(strings);
}

錯誤示范一

// 創(chuàng)建一個ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
// 獲得迭代器
Iterator<String> iterator = strings.iterator();
// 使用while循環(huán)迭代集合中元素 使用next方法判斷下一個元素是否為空
while (iterator.next() != null) {
    // 輸出這個元素
    System.out.println(iterator.next());
}

  第一個的錯誤原因:使用next方法判斷下一個元素是否為空,這樣就會導致"指針"到最后一個元素后面依舊會執(zhí)行next方法,這樣就會導致拋出NoSuchElementException異常;而且next方法每調用一次都會將"指針"向后移動一位,哪怕只是用于if判斷。所以程序就會每隔一個元素輸出一次,最后拋出NoSuchElementException異常

錯誤示范二

// 創(chuàng)建一個ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
// 獲取迭代器對象 并使用while循環(huán)迭代集合中元素 使用hasNext方法判斷
while (strings.iterator().hasNext()) {
    // 獲取迭代器對象 并使用next獲取下一個元素 然后輸出
    System.out.println(strings.iterator().next());
}

  第二個的錯誤原因:每使用iterator方法獲得一次集合對應的迭代器對象,都會默認將"指針"放到第一個元素的前面,于是第二個錯誤示范中一直使用集合中的第一個元素"a"進行判斷有沒有下一個元素,所以會導致程序陷入死循環(huán),循環(huán)體里也會一直創(chuàng)建結合的迭代器對象,并將"指針"放到第一個元素的前面,然后調用next方法輸出元素"a"

Collection集合接口知多少?

  集合大體上可以分為兩種,一種是單列的Collection集合,一種就是雙列的Map集合,所謂的單雙列可以理解為元素中數據的個數,單列集合一個數據作為元素存儲,雙列集合兩個具有映射關系的數據作為元素存儲。這一篇我們先學習Collection集合接口的內容,Collection集合按照元素存儲是否有序又可分為List集合、Set集合

  前面之所以先學習Iterator接口的原因就是,Collection接口繼承了Iteator接口,于是它的子接口set和list都可以使用迭代器對集合中的元素進行迭代

為什么不使用數組而是集合?

  在學習集合之前,我們將存儲多個對象或者元素的任務都交給了數組,但是數組存儲元素有以下缺點:

①數組一旦初始化之后,長度就確定不可修改,元素個數超出數組長度的話會拋異常。

②數組中提供的API很少,增加元素需要現將索引后的元素后移空出位置將元素添加進去,刪除元素需要刪除之后將后面的元素前移將空出來的位置補足,以上操作只能通過代碼實現并沒有現成的API可以使用。

③數組存儲數據的特點:有序、可重復,對于一些無需、不可重復的業(yè)務需求就很難滿足

  集合就可以很好的彌補數組的上述缺點,而且集合提供了一組較為完善的數據結構,我們可以根據具體的業(yè)務需求來選擇具體使用的集合類型。比如說存儲元素無序不可重復的Set集合,有序可重復的List集合,具有映射關系的Map集合等

Collection接口的API都有什么?

AbstractCollection類知多少?

  以上給出的Collection接口中的API都是抽象方法,也就意味著每一個此接口的實現類都需要重寫這些抽象方法,實際上Collection接口的直接或者間接實現類有很多,如果每一個都需要重寫這些方法的話就會很是麻煩。于是Java類庫的設計者提供了AbstractCollection類,該類中只將size方法和Iterator方法聲明為抽象,其他方法都提供了默認實現,如果子類不提供這些方法的方法體的話就使用該類中的默認實現

  下圖可知,list、set集合的實現類都直接或者間接的繼承了AbstractCollection類,為的就是簡化重寫Collection接口的抽象方法

到此這篇關于Java迭代器與Collection接口超詳細講解的文章就介紹到這了,更多相關Java迭代器與Collection接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入了解Java File分隔符和Path分隔符的使用

    深入了解Java File分隔符和Path分隔符的使用

    不同的操作系統使用不同的字符作為文件和路徑分隔符。當我們的應用程序需要在多個平臺上運行時,我們需要正確處理這些問題。Java幫助我們選擇一個合適的分隔符,本文就來聊聊Java中File分隔符和 Path分隔符的使用
    2022-07-07
  • 淺析Spring配置中的classpath:與classpath*:的區(qū)別

    淺析Spring配置中的classpath:與classpath*:的區(qū)別

    這篇文章主要介紹了Spring配置中的"classpath:"與"classpath*:"的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java進行反編譯生成.java文件方式(javap、jad下載安裝使用)

    Java進行反編譯生成.java文件方式(javap、jad下載安裝使用)

    這篇文章主要介紹了Java進行反編譯生成.java文件方式(javap、jad下載安裝使用),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java 數組內置函數toArray詳解

    Java 數組內置函數toArray詳解

    這篇文章主要介紹了Java 數組內置函數toArray詳解,文本詳細的講解了toArray底層的代碼和文檔,需要的朋友可以參考下
    2021-06-06
  • java集合框架線程同步代碼詳解

    java集合框架線程同步代碼詳解

    這篇文章主要介紹了java集合框架線程同步代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Java如何將BigDecimal類型的值轉成double類型

    Java如何將BigDecimal類型的值轉成double類型

    這篇文章主要給大家介紹了關于Java如何將BigDecimal類型的值轉成double類型的相關資料,需要注意精度損失和范圍限制,使用doubleValue方法進行轉換,并在高精度計算時格外小心,需要的朋友可以參考下
    2024-12-12
  • Java數據庫連接池技術的入門教程

    Java數據庫連接池技術的入門教程

    這篇文章主要給大家介紹了關于Java數據庫連接池技術的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • java定時器timer的使用方法代碼示例

    java定時器timer的使用方法代碼示例

    這篇文章主要介紹了java定時器timer的使用方法代碼示例,向大家分享了兩部分代碼,詳細內容請參見正文,還是比較不錯的,需要的朋友可以參考下。
    2017-11-11
  • jstack和線程dump實例解析

    jstack和線程dump實例解析

    這篇文章主要介紹了jstack和線程dump實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java使用wait/notify實現線程間通信下篇

    Java使用wait/notify實現線程間通信下篇

    wait()和notify()是直接隸屬于Object類,也就是說所有對象都擁有這一對方法,下面這篇文章主要給大家介紹了關于使用wait/notify實現線程間通信的相關資料,需要的朋友可以參考下
    2022-12-12

最新評論

会理县| 武穴市| 青州市| 从江县| 腾冲县| 义马市| 梓潼县| 平安县| 明溪县| 广宁县| 彝良县| 关岭| 南康市| 泾川县| 乌审旗| 巴彦县| 马尔康县| 乐山市| 民县| 台州市| 宁海县| 诏安县| 微博| 乐东| 丹寨县| 牡丹江市| 陇川县| 巢湖市| 顺平县| 涪陵区| 西乌珠穆沁旗| 铁岭县| 成都市| 麦盖提县| 临湘市| 清徐县| 博白县| 宁河县| 布拖县| 桃园县| 和龙市|