for (元素類型T 元素變數名O : 遍歷對象) {
// 對 O 進行操作
}
String[] names = {"beibei", "jingjing"};
for (String name : names) {
System.out.println(name);
}
List<String> list = new ArrayList<>();
list.add("a"); list.add("b"); list.add("c");
for (String str : list) {
System.out.println(str);
}
foreach 僅能遍歷,無法在遍歷過程中修改原陣列或集合內容,for 迴圈則可。
String[] names = {"beibei", "jingjing"};
// foreach:無法修改原陣列
for (String name : names) {
name = "huanhuan"; // 只修改區域變數引用
}
System.out.println("foreach: " + Arrays.toString(names)); // [beibei, jingjing]
// for:可修改原陣列
for (int i = 0; i < names.length; i++) {
names[i] = "huanhuan";
}
System.out.println("for: " + Arrays.toString(names)); // [huanhuan, huanhuan]
List<String> names = new ArrayList<>();
names.add("beibei"); names.add("jingjing");
// foreach:無法修改集合元素
for (String name : names) {
name = "huanhuan";
}
System.out.println(names); // [beibei, jingjing]
// for:可修改集合元素
for (int i = 0; i < names.size(); i++) {
names.set(i, "huanhuan");
}
System.out.println(names); // [huanhuan, huanhuan]
foreach 底層實際使用迭代器,若在遍歷中調用集合的 remove/add 會拋出 ConcurrentModificationException。需使用迭代器自身的 remove() 方法或採用 for 迴圈倒序遍歷刪除。
在 for (int i = 0; i < list.size(); i++) 中,list.size() 在每次迴圈迭代前都會重新計算;但若寫成 int len = list.size(); for (int i = 0; i < len; i++) 則只計算一次。這對於動態變化的集合大小有顯著影響。