1. 你知道for 與 foreach 的區(qū)別嗎?

        共 616字,需瀏覽 2分鐘

         ·

        2022-05-28 12:37

        不點藍字關注,我們哪來故事?


        一個指導程序員進入大公司/獨角獸?的精品社群,致力于分享職場達人的專業(yè)打法,包括「學習路線+簡歷模板+實習避坑+筆試面試+試用轉正+升職加薪+跳槽技巧」。

        點這里去了解,劍指大廠吧!








        之前有一個同事突然我問了我一個問題,說在foreach當中能不能刪除list里面的元素,我當時大概說了一下是否能刪除,以及原因;接下來我們來探討一下是否能夠如此;

        (1)遍歷元素

        首先,我們一一段代碼為例:

        String[]?array?=?{"1",?"2",?"3"};
        for?(String?i?:?array)?{
        ????System.out.println(i);
        }

        ArrayList?list?=?new?ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        for?(String?i?:?list)?{
        ????System.out.println(i);
        }

        遍歷后結果如下:

        1
        2
        3
        111
        222
        333

        結果毫無疑問。

        我們再來看看編譯后的源碼(idea自帶,在target包里打開你的類源碼文件即可):

        String[]?array?=?new?String[]{"1",?"2",?"3"};
        String[]?var2?=?array;
        int?var3?=?array.length;

        for(int?var4?=?0;?var4?????String?i?=?var2[var4];
        ????System.out.println(i);
        }

        ArrayList?list?=?new?ArrayList();
        list.add("111");
        list.add("222");
        list.add("333");
        Iterator?var7?=?list.iterator();

        while(var7.hasNext())?{
        ????String?i?=?(String)var7.next();
        ????System.out.println(i);
        }

        可見,遍歷數(shù)組使用的是原始for循環(huán),集合的話使用的是Iterator迭代器。

        (2)刪除元素

        哦的k!接下來我們來刪除元素:

        使用for循環(huán):

        ArrayList?list?=?new?ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        log.info(list.toString());
        for?(int?i?=?0;?i?????list.remove("222");
        }

        log.info(list.toString());

        結果:

        11:11:52.532?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?222,?333]
        11:11:52.539?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?333]

        顯然成功!

        使用foreach:

        ArrayList?list?=?new?ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        log.info(list.toString());
        for?(String?i?:?list)?{
        ??list.remove("222");
        }
        log.info(list.toString());

        結果:

        11:50:48.333?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?222,?333]
        Exception?in?thread?"main"?java.util.ConcurrentModificationException
        ?at?java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
        ?at?java.util.ArrayList$Itr.next(ArrayList.java:859)
        ?at?com.xiaolinge.com.hello.HelloWord.main(HelloWord.java:30)

        顯然木有成功!

        原因:

        迭代器內部的每次遍歷都會記錄List內部的modcount當做預期值,然后在每次循環(huán)中用預期值與List的成員變量modCount作比較,但是普通list.remove調用的是List的remove,這時modcount++,但是iterator內記錄的預期值=并沒有變化,所以會報錯。

        如果想要刪除元素的話需要使用迭代器內部的remove方法:

        ArrayList?list?=?new?ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        log.info(list.toString());
        Iterator?it?=?list.iterator();
        while?(it.hasNext()){
        ????String?next?=?it.next();
        ????//if外使用list的remove方法還是會報錯的
        ????if(next.equals("222")){
        ????????it.remove();//這里使用的是迭代器里面的remove()方法,
        ????????//?當然如果使用list的remove方法在此刪除質地感元素的話是成功的,比如:list.remove("222")
        ????}
        }
        log.info(list.toString());

        結果:

        12:06:14.042?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?222,?333]
        12:06:14.046?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?333]

        (3)修改元素

        使用原始for:

        ArrayList?list?=?new?ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        log.info(list.toString());
        for?(int?i?=?0;?i?????list.set(i,"444");
        }
        ?log.info(list.toString());

        結果:

        12:12:56.910?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?222,?333]
        12:12:56.915?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[444,?444,?444]

        哦的k!可以修改元素;

        使用foreach:

        ArrayList?list?=?new?ArrayList<>();
        ?list.add("111");
        ?list.add("222");
        ?list.add("333");
        ?log.info(list.toString());
        for?(String?i?:?list)?{
        ?????i="444";
        ?}
        ??log.info(list.toString());??

        結果:

        12:34:47.207?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?222,?333]
        12:34:47.211?[main]?INFO?com.xiaolinge.com.hello.HelloWord?-?[111,?222,?333]

        看到咯,不行的哦。

        辣么,修改元素不行,修改元素的屬性可不可以呢?讓我們來看下吧。

        (4)foreach修改元素屬性

        (for就不測試了)

        創(chuàng)建一個學生類:

        public?class?Student?{
        ????????private?int?age;
        ????????public?int?getAge()?{
        ????????????return?age;
        ????????}
        ????????public?void?setAge(int?age)?{
        ????????????this.age?=?age;
        ????????}
        ????????public?String?getName()?{
        ????????????return?name;
        ????????}
        ????????public?void?setName(String?name)?{
        ????????????this.name?=?name;
        ????????}
        ????????private?String?name;
        ????????public?Student(){};
        ????????public?Student(int?age,String?name){
        ????????????this.age=age;
        ????????????this.name=name;
        ????????}
        ????}?

        哦的k,接下來測試代碼:

        ?Student?student=new?Student(1,"huge");
        ????????Student?student1=new?Student(1,"xiaoyao");
        ????????List?studentList=new?ArrayList();
        ????????studentList.add(student);
        ????????studentList.add(student1);
        ????????System.out.println(student.getName());
        ????????System.out.println(student1.getName());
        ????????for(Student?stu:studentList)
        ????????{
        ????????????stu.setName("jingtian");
        ????????}
        ????????System.out.println(student.getName());
        ????????System.out.println(student1.getName());

        結果:

        huge
        xiaoyao
        jingtian
        jingtian

        484很神奇!修改不了對象,卻可以修改對象的屬性。

        總結

        • for與foreach都可以遍歷數(shù)組/集合,不過for則在較復雜的循環(huán)中效率更高。

        • foreach不可以刪除/修改集合元素,而for可以

        • foreach和for都可以修改元素里面的屬性

        所以相比較下來for循環(huán)更為靈活。

        推薦


        歡迎加入我的知識星球,一起劍指大廠,不斷晉升加薪。

        劍指大廠不僅是一個獲取信息的圈子,還是一個規(guī)劃職業(yè)的導師。已在知識星球,更新如下點這里去了解,劍指大廠吧!或點擊下圖了解):


        //////?END?//////
        ↓ 點擊下方關注,看更多架構分享?↓
        瀏覽 21
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 青娱乐 欧美在线视频 | 国产操逼片 | ass日本另类肉体图pics | 青青草青青日青青干视频 | 男女插插插 |