同事使用foreach删除元素发生了错误,我建议他使用迭代器删除
于是我研究了普通的for循环删除元素的可能性
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
log.info(list.toString());
for (int i = 0; i <list.size(); i++) {
list.remove("a");
}
log.info(list.toString());
删除成功了!
使用foreach
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
log.info(list.toString());
for (String s : list) {
list.remove("a");
}
log.info(list.toString());
运行报错。反编译class文件发现,对集合使用foreach本质上是用的迭代器
迭代器要使用remove方法进行元素删除。
Iterator var2 = list.iterator();
while(var2.hasNext()) {
var2.remove();
}
总结了几点
-
for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。
-
在固定长度或者长度不需要计算的时候for循环效率高于foreach
-
foreach不可以删除/修改集合元素,而for可以
-
foreach和for都可以修改元素里面的属性