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

Java深入分析Iterator迭代器與foreach循環(huán)的使用

 更新時(shí)間:2022年05月17日 10:43:29   作者:小老師ir  
這篇文章主要介紹了Java-Iterator迭代器與foreach循環(huán),主要包括Iterator迭代器接口的操作方法和foreach?循環(huán)語法解析,需要的朋友可以參考下

一、Iterator迭代器接口

1. 使用Iterator接口遍歷集合元素

Iterator對(duì)象稱為迭代器(設(shè)計(jì)模式的一種),主要用于遍歷 Collection 集合中的元素。

GOF給迭代器模式的定義為:提供一種方法訪問一個(gè)容器(container)對(duì)象中各個(gè)元素,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)。迭代器模式,就是為容器而生。類似于“公交車上的售票員”、“火車上的乘務(wù)員”、“空姐”。

Collection接口繼承了java.lang.Iterable接口,該接口有一個(gè)iterator()方法,那么所有實(shí)現(xiàn)了Collection接口的集合類都有一個(gè)iterator()方法,用以返回一個(gè)實(shí)現(xiàn)了 Iterator接口的對(duì)象。

Iterator 僅用于遍歷集合,Iterator 本身并不提供承裝對(duì)象的能力。如果需要?jiǎng)?chuàng)建 Iterator對(duì)象,則必須有一個(gè)被迭代的集合。

集合對(duì)象每次調(diào)用iterator()方法都得到一個(gè)全新的迭代器對(duì)象,默認(rèn)游標(biāo)都在集合 的第一個(gè)元素之前。

2. Iterator接口的方法

注意:在調(diào)用it.next()方法之前必須要調(diào)用it.hasNext()進(jìn)行檢測(cè)。若不調(diào)用,且下一條記錄無效,直接調(diào)用it.next()會(huì)拋出NoSuchElementException異常。

3. 迭代器的執(zhí)行原理

3.1 代碼演示

//hasNext():判斷是否還有下一個(gè)元素
while(iterator.hasNext()){
//next():①指針下移 ②將下移以后集合位置上的元素返回
System.out.println(iterator.next());
}

3.2 代碼執(zhí)行過程解析

當(dāng)執(zhí)行Iterator iterator = coll.iterator();語句時(shí),iterator的指針此時(shí)執(zhí)行下圖的①所標(biāo)的位置,然后執(zhí)行iterator.hasNext()語句,此時(shí)會(huì)去判斷iterator的指針指向的位置的下一個(gè)位置(即②)有無元素,若有,則返回true,否則返回false。當(dāng)返回結(jié)果為true時(shí),則往下執(zhí)行 iterator.next()語句,此時(shí)iterator的指針下移并且把下移后的指針指向的集合位置上的元素返回。

4. Iterator接口remove()方法

4.1 代碼演示

Iterator iter = coll.iterator();//回到起點(diǎn)
while(iter.hasNext()){
Object obj = iter.next();
if(obj.equals("Tom")){
iter.remove();
} }

4.2 注意

Iterator可以刪除集合的元素,但是是遍歷過程中通過迭代器對(duì)象的remove方法,不是集合對(duì)象的remove方法。

如果還未調(diào)用next()或在上一次調(diào)用 next() 方法之后已經(jīng)調(diào)用了 remove 方法,再調(diào)用remove都會(huì)報(bào)IllegalStateException異常。

5. 代碼演示

    @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());
//        //報(bào)異常:NoSuchElementException
//        System.out.println(iterator.next());

        //方式二:不推薦
//        for(int i = 0;i < coll.size();i++){
//            System.out.println(iterator.next());
//        }
        //方式三:推薦
        hasNext():判斷是否還有下一個(gè)元素
        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);
        //錯(cuò)誤方式一:
//        Iterator iterator = coll.iterator();
//        while((iterator.next()) != null){
//            System.out.println(iterator.next());
//        }
        //錯(cuò)誤方式二:
        //集合對(duì)象每次調(diào)用iterator()方法都得到一個(gè)全新的迭代器對(duì)象,默認(rèn)游標(biāo)都在集合的第一個(gè)元素之前。
        while (coll.iterator().hasNext()){
            System.out.println(coll.iterator().next());
        }
    }
    //測(cè)試Iterator中的remove()
    //如果還未調(diào)用next()或在上一次調(diào)用 next 方法之后已經(jīng)調(diào)用了 remove 方法,
    // 再調(diào)用remove都會(huì)報(bào)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());
        }
    }

二、foreach 循環(huán)

1. 概述

Java 5.0 提供了 foreach 循環(huán)迭代訪問 Collection和數(shù)組。

遍歷操作不需獲取Collection或數(shù)組的長度,無需使用索引訪問元素。

遍歷集合的底層調(diào)用Iterator完成操作。

foreach還可以用來遍歷數(shù)組。

2. 語法解析

3. 代碼演示

    @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(集合元素的類型 局部變量 : 集合對(duì)象)
        //內(nèi)部仍然調(diào)用了迭代器。
        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(數(shù)組元素的類型 局部變量 : 數(shù)組對(duì)象)
        for(int i : arr){
            System.out.println(i);
        }
        //1
        //2
        //3
        //4
        //5
        //6
    }

4. 易錯(cuò)題

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
    }
}

到此這篇關(guān)于Java深入分析Iterator迭代器與foreach循環(huán)的使用的文章就介紹到這了,更多相關(guān)Java Iterator迭代器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot?使用?Hutool-jwt?實(shí)現(xiàn)?token?驗(yàn)證功能

    Spring?Boot?使用?Hutool-jwt?實(shí)現(xiàn)?token?驗(yàn)證功能

    JWT?就是一種網(wǎng)絡(luò)身份認(rèn)證和信息交換格式,這篇文章主要介紹了Spring Boot使用Hutool-jwt實(shí)現(xiàn)token驗(yàn)證,需要的朋友可以參考下
    2023-07-07
  • SpringBoot2入門自動(dòng)配置原理及源碼分析

    SpringBoot2入門自動(dòng)配置原理及源碼分析

    這篇文章主要為大家介紹了SpringBoot2入門自動(dòng)配置原理及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫加密以及踩坑的記錄分享

    SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫加密以及踩坑的記錄分享

    這篇文章主要介紹了SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫加密以及踩坑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java Excel文件加密保護(hù)數(shù)據(jù)安全

    Java Excel文件加密保護(hù)數(shù)據(jù)安全

    這篇文章主要為大家介紹了Java Excel文件加密保護(hù)數(shù)據(jù)安全的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能詳解

    Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能詳解

    這篇文章主要介紹了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能,較為詳細(xì)的講述了橋接模式的概念、原理并結(jié)合實(shí)例形式分析了Java使用橋接模式實(shí)現(xiàn)開關(guān)和電燈照明功能相關(guān)操作步驟與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    這篇文章主要為大家介紹了PowerJob分布式任務(wù)調(diào)度源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • SpringBoot異常錯(cuò)誤頁面實(shí)現(xiàn)方法介紹

    SpringBoot異常錯(cuò)誤頁面實(shí)現(xiàn)方法介紹

    在項(xiàng)目訪問的時(shí)候我們經(jīng)常會(huì)發(fā)生錯(cuò)誤或者頁面找不到,比如:資源找不到404,服務(wù)器500錯(cuò)誤,默認(rèn)情況下springboot的處理機(jī)制都是去跳轉(zhuǎn)內(nèi)部的錯(cuò)誤地址:/error 和與之對(duì)應(yīng)的一個(gè)錯(cuò)誤頁面
    2022-09-09
  • IntelliJ IDEA版Postman強(qiáng)大功能介紹

    IntelliJ IDEA版Postman強(qiáng)大功能介紹

    這篇文章主要為大家介紹了IDEA版Postman的強(qiáng)大功能介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • MyBatis查詢無記錄時(shí)的返回值問題

    MyBatis查詢無記錄時(shí)的返回值問題

    這篇文章主要介紹了MyBatis查詢無記錄時(shí)的返回值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring IOC創(chuàng)建對(duì)象的兩種方式

    Spring IOC創(chuàng)建對(duì)象的兩種方式

    這篇文章主要給大家介紹了關(guān)于Spring IOC創(chuàng)建對(duì)象的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

宁强县| 乳山市| 韶山市| 瓦房店市| 广安市| 三穗县| 安仁县| 亳州市| 和林格尔县| 五原县| 湟中县| 湘乡市| 阿拉尔市| 田阳县| 阳曲县| 开平市| 密云县| 桑日县| 临安市| 威信县| 武城县| 中方县| 高台县| 平安县| 扶绥县| 灌阳县| 贞丰县| 通江县| 大竹县| 横峰县| 凌海市| 房产| 满洲里市| 海原县| 陇南市| 平江县| 宁海县| 金门县| 龙江县| 澄城县| 灌云县|