你能说清楚For和Foreach有什么区别吗?
创始人
2025-07-04 22:30:44
0

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

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

1、遍历元素

首先,上代码:
Integer[] array = {1,2,3};
for(int i=0;i 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 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 list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
for (int i = 0; i 

结果:

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

使用foreach:

List 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 list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
Iterator 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 list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list.toString());
for (int i = 0; i 

结果:

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

没问题,可以修改元素;

使用foreach:

List 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 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循环更为灵活。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...