今天来分享一个小知识点,看看你能回答上来吗?
在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循环更为灵活。