Rumah > Java > javaTutorial > teks badan

Apakah perbezaan antara gelung for dan foreach di Jawa?

WBOY
Lepaskan: 2023-04-21 19:46:06
ke hadapan
696 orang telah melayarinya

(1) Elemen traverse

Pertama, mari kita ambil sekeping kod sebagai contoh:

        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);
        }
Salin selepas log masuk

Hasil selepas traversal adalah seperti berikut:

1
2
3
111
222
333

Hasilnya tidak diragukan lagi.
Mari kita lihat kod sumber yang disusun (ia datang dengan idea, cuma buka fail kod sumber kelas anda dalam pakej sasaran):

        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);
        }
Salin selepas log masuk

Ia boleh dilihat bahawa gelung asal adalah digunakan untuk melintasi tatasusunan Untuk koleksi, iterator digunakan.

(2) Padamkan elemen

Ya ampun! Seterusnya kita padamkan elemen:
Gunakan untuk gelung:

        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());
Salin selepas log masuk

Keputusan:

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

Jelas sekali berjaya!
Gunakan 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());
Salin selepas log masuk

Keputusan:

11:50:48.333 [utama] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
Pengecualian dalam utas "utama" java.util.ConcurrentModificationException
di java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
di java.util.ArrayList$Itr.next( ArrayList.java:859)
di com.xiaolinge.com.hello.HelloWord.main(HelloWord.java:30)

Jelas sekali tidak berjaya!

Sebab:

Setiap lelaran di dalam iterator akan merekodkan modcount di dalam Senarai sebagai nilai yang dijangkakan, dan kemudian membandingkan nilai yang diharapkan dengan modCount pembolehubah ahli Senarai dalam setiap gelung, tetapi Panggilan list.remove biasa Alih keluar senarai Pada masa ini, modcount++ digunakan, tetapi nilai dijangka = direkodkan dalam iterator tidak berubah, jadi ralat akan dilaporkan.
Jika anda ingin memadamkan elemen, anda perlu menggunakan kaedah alih keluar di dalam lelaran:

        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方法还是会报错的
            if(next.equals("222")){
                it.remove();//这里使用的是迭代器里面的remove()方法,
                // 当然如果使用list的remove方法在此删除质地感元素的话是成功的,比如:list.remove("222")
            }
        }
        log.info(list.toString());
Salin selepas log masuk

Keputusan:

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

(3) Ubah suai elemen

menggunakan asal untuk:

        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());
Salin selepas log masuk

Keputusan:

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

<🎜
Oh The k! Elemen boleh diubah suai;

Gunakan 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());
Salin selepas log masuk
Keputusan:

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

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

Lihat , itu tidak akan berkesan.

Apa masalahnya? Tidak mungkin untuk mengubah suai elemen, tetapi adakah mungkin untuk mengubah suai atribut elemen? Mari kita lihat.

(4) foreach mengubah suai atribut elemen

(kerana tidak akan diuji)

Buat kelas pelajar:

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;
        }
    }
Salin selepas log masuk
Oh k, Seterusnya uji kod:

    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());
Salin selepas log masuk
Keputusan:

besar

xiaoyao
jingtian
jingtian

484 sangat mengagumkan ! Objek tidak boleh diubah suai, tetapi sifat objek boleh diubah suai.

Atas ialah kandungan terperinci Apakah perbezaan antara gelung for dan foreach di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan