你能说清楚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循环更为灵活。

举报
评论 0