小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 wuhancar 2022-05-04 發(fā)布于湖北

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

(1)遍歷元素

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

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

ArrayList<String> 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é)果毫無(wú)疑問(wèn)。

我們?cè)賮?lái)看看編譯后的源碼(idea自帶,在target包里打開(kāi)你的類源碼文件即可):

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

for(int var4 = 0; var4 < var3; ++var4) {
    String i = var2[var4];
    System.out.println(i);
}

ArrayList<String> 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);
}

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

(2)刪除元素

哦的k!接下來(lái)我們來(lái)刪除元素:

使用for循環(huán):
ArrayList<String> list = new ArrayList<>();
list.add('111');
list.add('222');
list.add('333');
log.info(list.toString());
for (int i = 0; i <list.size(); i++) {
    list.remove('222');
}

log.info(list.toString());

結(jié)果:

11:11:52.532 [main] INFO com.xiaolinge.com.hello.HelloWord - [111222333]
11:11:52.539 [main] INFO com.xiaolinge.com.hello.HelloWord - [111333]

顯然成功!

使用foreach:
ArrayList<String> 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)部的每次遍歷都會(huì)記錄List內(nèi)部的modcount當(dāng)做預(yù)期值,然后在每次循環(huán)中用預(yù)期值與List的成員變量modCount作比較,但是普通list.remove調(diào)用的是List的remove,這時(shí)modcount++,但是iterator內(nèi)記錄的預(yù)期值=并沒(méi)有變化,所以會(huì)報(bào)錯(cuò)。

如果想要?jiǎng)h除元素的話需要使用迭代器內(nèi)部的remove方法:

ArrayList<String> list = new ArrayList<>();
list.add('111');
list.add('222');
list.add('333');
log.info(list.toString());
Iterator<String> it = list.iterator();
while (it.hasNext()){
    String next = it.next();
    //if外使用list的remove方法還是會(huì)報(bào)錯(cuò)的
    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<String> list = new ArrayList<>();
list.add('111');
list.add('222');
list.add('333');
log.info(list.toString());
for (int i = 0; i <list.size(); 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<String> 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]

看到咯,不行的哦。

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

(4)foreach修改元素屬性

(for就不測(cè)試了)

創(chuàng)建一個(gè)學(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,接下來(lái)測(cè)試代碼:

 Student student=new Student(1,'huge');
        Student student1=new Student(1,'xiaoyao');
        List<Student> studentList=new ArrayList<Student>();
        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很神奇!修改不了對(duì)象,卻可以修改對(duì)象的屬性。

總結(jié)

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

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

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多