你能说清楚For和Foreach有什么区别吗?

开发 后端
在Java编程的世界里,For循环和Foreach循环是两个常见的迭代结构,用于遍历数据集合或执行重复操作。然而,很多人常常混淆这两者,不清楚它们之间的区别,想用哪个就用哪个。今天我们就详细探讨下For循环和Foreach循环的不同之处,帮助你理解它们的用途和适用场景,并提供一些示例来帮助你更好地掌握这两种循环。

今天来分享一个小知识点,看看你能回答上来吗?

在Java编程的世界里,for循环和foreach循环是两个常见的迭代结构,用于遍历数据集合或执行重复操作。然而,很多人常常混淆这两者,不清楚它们之间的区别,想用哪个就用哪个。今天我们就详细探讨下for循环和foreach循环的不同之处,帮助你理解它们的用途和适用场景,并提供一些示例来帮助你更好地掌握这两种循环。

1、遍历元素

首先,上代码:
Integer[] array = {1,2,3};
for(int i=0;i<array.length;i++){
  System.out.println(array[i]);
}

List<Integer> list = new ArrayList<>();
list.add(4);
list.add(5);
list.add(6);
for(Integer i:list){
  System.out.println(i);
}

遍历后结果如下:

1
2
3
4
5
6

我们来看看编译后的代码:

Integer[] array = new Integer[]{1, 2, 3};

        for(int i = 0; i < array.length; ++i) {
            System.out.println(array[i]);
        }

        List<Integer> list = new ArrayList();
        list.add(4);
        list.add(5);
        list.add(6);
        Iterator var3 = list.iterator();

        while(var3.hasNext()) {
            Integer i = (Integer)var3.next();
            System.out.println(i);
        }

数组使用的是原始的for循环,而集合使用的是iterator迭代器。

2、删除元素

使用for循环:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
for (int i = 0; i <list.size(); i++) {
  list.remove("2");
}
System.out.println(list);

结果:

[1, 2, 3]
[1, 3]

使用foreach:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
for (String i : list) {
  list.remove("2");
}
System.out.println(list.toString());

结果:

[1, 2, 3]
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at com.example.ForDemo.main(ForDemo.java:41)

直接报错!

原因:

迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值=并没有变化,所以会报错。

如果想要删除元素的话需要使用迭代器内部的remove方法:

ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
Iterator<String> it = list.iterator();
while (it.hasNext()){
  String next = it.next();
  //if外使用list的remove方法还是会报错的
  if(next.equals("2")){
    //这里使用的是迭代器里面的remove()方法,
    // 当然如果使用list的remove方法在此删除指定元素的话是也是可以成功的,比如:list.remove("2")
    it.remove();
  }
}
System.out.println(list.toString());

结果:

[1, 2, 3]
[1, 3]

3、修改元素

使用for循环:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
for (int i = 0; i <list.size(); i++) {
  list.set(i,"4");
}
System.out.println(list.toString());

结果:

[1, 2, 3]
[4, 4, 4]

没问题,可以修改元素;

使用foreach:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
for (String i : list) {
  i="4";
}
System.out.println(list.toString());

结果:

[1, 2, 3]
[1, 2, 3]

没有变化,修改不了;

修改元素不行,修改元素的属性行不行呢?让我们来看下吧。

4、foreach修改元素属性

创建一个测试类:

public class People {
    private String name;
    private Integer age;

    public People(){

    }

    public People(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

哦的k,接下来测试代码:

People p1=new People("张三",20);
People p2=new People("李四",21);
List<People> peopleList=new ArrayList<>();
peopleList.add(p1);
peopleList.add(p2);
System.out.println(p1.getName());
System.out.println(p2.getName());
for(People people:peopleList)
{
  people.setName("王麻子");
}
System.out.println(p1.getName());
System.out.println(p2.getName());

结果:

张三
李四
王麻子
王麻子

Amazing!这次成功了,修改不了对象,却可以修改对象的属性。

总结

for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。foreach不可以删除/修改集合元素,而for可以foreach和for都可以修改元素里面的属性,所以相比较下来for循环更为灵活。

责任编辑:姜华 来源: 今日头条
相关推荐

2019-08-16 09:40:16

网络计算机通信网络

2023-12-13 13:31:00

useEffect对象浏览器

2020-08-02 23:20:36

JavaScriptmap()forEach()

2022-03-13 18:53:31

interfacetypeTypeScript

2020-03-02 15:17:37

云原生CNCF容器

2022-07-21 21:19:48

元宇宙

2023-03-28 07:51:56

CPU主板平台

2019-07-04 09:13:04

中台百度团队

2021-02-25 08:21:38

高可用风险故障

2020-10-29 10:35:53

Nginx架构服务器

2020-01-13 15:34:10

超融合边缘计算架构

2021-02-06 21:57:40

Debug模式Release

2022-06-08 07:34:25

InnoDBdeleteMySQL

2021-07-27 08:02:45

DTO 软件Pojo

2019-10-21 08:51:41

分布式事务CAPAP

2018-07-26 09:06:29

Java内存模型

2024-03-05 18:19:07

localhostLinux数据库

2020-03-09 20:56:19

LoRaLoRaWAN无线技术

2022-09-07 18:32:57

并发编程线程

2022-06-06 14:53:02

LoRaLoRaWAN
点赞
收藏

51CTO技术栈公众号