<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          竟然有一半的人不知道 for 與 foreach 的區(qū)別???

          共 512字,需瀏覽 2分鐘

           ·

          2022-05-09 23:00

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

          (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);
          }

          遍歷后結(jié)果如下:

          1
          2
          3
          111
          222
          333

          結(jié)果毫無疑問。

          我們再來看看編譯后的源碼(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());

          結(jié)果:

          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());

          結(jié)果:

          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)

          顯然木有成功!

          原因:

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

          如果想要刪除元素的話需要使用迭代器內(nèi)部的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()方法,
          ????????//?當(dāng)然如果使用list的remove方法在此刪除質(zhì)地感元素的話是成功的,比如:list.remove("222")
          ????}
          }
          log.info(list.toString());

          結(jié)果:

          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());

          結(jié)果:

          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());??

          結(jié)果:

          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)建一個學(xué)生類:

          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());

          結(jié)果:

          huge
          xiaoyao
          jingtian
          jingtian

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

          總結(jié)

          • for與foreach都可以遍歷數(shù)組/集合,不過for則在較復(fù)雜的循環(huán)中效率更高。
          • foreach不可以刪除/修改集合元素,而for可以
          • foreach和for都可以修改元素里面的屬性

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

          轉(zhuǎn)自:https://blog.csdn.net/qq_40521656/article/details/90749927


          推薦閱讀:

          世界的真實格局分析,地球人類社會底層運行原理

          不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

          億級(無限級)并發(fā),沒那么難

          論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?

          華為干部與人才發(fā)展手冊(附PPT)

          企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!

          【中臺實踐】華為大數(shù)據(jù)中臺架構(gòu)分享.pdf

          華為的數(shù)字化轉(zhuǎn)型方法論

          華為如何實施數(shù)字化轉(zhuǎn)型(附PPT)

          超詳細(xì)280頁Docker實戰(zhàn)文檔!開放下載

          華為大數(shù)據(jù)解決方案(PPT)

          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美性爱亚洲色图 | 日韩性爱片 | 天天爽天天舔 | 北条麻妃 无码 在线 视频 | 手机A……V在线观看 |