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

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

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

网站栏目:你能说清楚For和Foreach有什么区别吗?
分享URL:http://www.csdahua.cn/qtweb/news6/444006.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网