1.代码直观对比
传统for循环
for (Iterator<String> i = list.iterator();i.hasNext();) {
doSomething(i.next());
}
for (int i = 0; i < list.size(); i++) {
doSomething(list.get(i));
}
for-each
for (String str : list) {
doSomething(str);
}
2.for-each的优势
比传统的for循环:
- 简洁性
- 有效预防bug
- 不用担心性能损失
关于有效预防bug以及简洁性,请看以下代码:
// 不简洁,同时易误导致bug
for (Iterator<String> i = list.iterator();i.hasNext();) {
for (Iterator<String> j = list2.iterator();j.hasNext();) {
doSomething(i.next(),j.next());
}
}
// 简洁
for (String s : list) {
for (String s1 : list2) {
doSomething(s,s1);
}
}
3.不能使用for-each情况
(1)过滤
如果需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用它的remove方法。
// 正确做法
for (Iterator<String> i = list.iterator();i.hasNext();) {
i.next(); // 指向要删除的元素
i.remove();
}
// 错误做法
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
// 错误做法
for (String s : list) {
list.remove(s);
}
关于删除集合元素参考:Java循环删除集合多个元素的正确打开方式
(2)转换
如果需要遍历所有元素,然后重新设定某些值,那么就需要李彪迭代器或者数组索引,以便设定元素的值。
(3)平行迭代
就是并行地同时遍历多个集合,需要显示地控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移。