你能說清楚For和Foreach有什么區(qū)別嗎?
今天來分享一個小知識點,看看你能回答上來嗎?
在Java編程的世界里,for循環(huán)和foreach循環(huán)是兩個常見的迭代結構,用于遍歷數據集合或執(zhí)行重復操作。然而,很多人常?;煜@兩者,不清楚它們之間的區(qū)別,想用哪個就用哪個。今天我們就詳細探討下for循環(huán)和foreach循環(huán)的不同之處,幫助你理解它們的用途和適用場景,并提供一些示例來幫助你更好地掌握這兩種循環(huán)。
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循環(huán),而集合使用的是iterator迭代器。
2、刪除元素
使用for循環(huán):
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當做預期值,然后在每次循環(huán)中用預期值與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循環(huán):
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修改元素屬性
創(chuàng)建一個測試類:
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則在較復雜的循環(huán)中效率更高。foreach不可以刪除/修改集合元素,而for可以foreach和for都可以修改元素里面的屬性,所以相比較下來for循環(huán)更為靈活。