1 for循环size遍历删除
/**
* 普通For循环删除list元素
*
* @param list 列表
*/
private static List<String> removeElementByFor(List<String> list) {
for(int i=0; i<list.size(); i++) {
if(list.get(i).equals("delete")) {
list.remove(i);
}
}
return list;
}
2 foreach遍历删除
/**
* 增强For循环删除list元素
*
* @param list 列表
*/
private static List<String> removeElementByForEnhanced(List<String> list) {
for(String li : list) {
if(li.equals("delete")) {
list.remove(li);
}
}
return list;
}
3 Iterator遍历删除
/**
* 迭代方法循环删除list元素
*
* @param list 列表
*/
private static List<String> removeElementByIterator(List<String> list) {
Iterator<String> li = list.iterator();
while(li.hasNext()) {
String e = li.next();
if(e.equals("delete")) {
li.remove();
}
}
return list;
}
4 测试
package datastructure;
import common.UserEntity;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* List测试
* @author xindaqi
* @since 2021-01-23
*/
public class ListTest {
private static final Logger logger = Logger.getLogger("ListTest");
/**
* 普通For循环删除list元素
*
* @param list 列表
*/
private static List<String> removeElementByFor(List<String> list) {
for(int i=0; i<list.size(); i++) {
if(list.get(i).equals("delete")) {
list.remove(i);
}
}
return list;
}
/**
* 增强For循环删除list元素
*
* @param list 列表
*/
private static List<String> removeElementByForEnhanced(List<String> list) {
for(String li : list) {
if(li.equals("delete")) {
list.remove(li);
}
}
return list;
}
/**
* 迭代方法循环删除list元素
*
* @param list 列表
*/
private static List<String> removeElementByIterator(List<String> list) {
Iterator<String> li = list.iterator();
while(li.hasNext()) {
String e = li.next();
if(e.equals("delete")) {
li.remove();
}
}
return list;
}
public static void main(String[] args) {
logger.info("List测试");
List<String> list = Stream.of("delete", "delete", "xiaoxiao", "delete", "xiaoer", "tiantian", "delete", "xiaohua").collect(Collectors.toList());
// 单独测试
logger.info("List removed by iterator: " + removeElementByIterator(list));
logger.info("List removed by for: " + removeElementByFor(list));
logger.info("List removed by for enhanced: " + removeElementByForEnhanced(list));
}
}
5 测试结果
5.1 for删除
使用for删除,删除时,列表元素发生改变,元素位置向前移动,若移除的元素是连续的,则会漏删。
List removed by for: [delete, xiaoxiao, xiaoer, tiantian, xiaohua]
5.2 增强for删除
使用增强删除,会出现并发异常,即修改元素的同时调整元素位置。
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 datastructure.ListTest.removeElementByForEnhanced(ListTest.java:52)
at datastructure.ListTest.main(ListTest.java:89)
5.3 迭代删除
正常修改,保证并发安全以及完整删除。
信息: List removed by iterator: [xiaoxiao, xiaoer, tiantian, xiaohua]
6 小结
使用迭代方法(iterator())删除List元素。