public List<String> initList = Arrays.asList("张三", "李四", "周一", "刘四", "李强", "李白");
如何删除List中姓李的人?
普通for循环删除
/**
* 普通 for 循环删除
* @author: 小帆子
*/
@Test
public void remove1() {
List<String> list = new ArrayList(initList);
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if (str.startsWith("李")) {
list.remove(i);
}
}
System.out.println(list);
}
结果:[张三, 周一, 刘四, 李白]
list.size() 和 i 都是动态变化的,i 的值一直在累加,list.size() 一直在减少,所以 list 就会早早结束了循环
普通 for 循环提取变量删除
/**
* 普通 for 循环删除(size提出变量)
* @author: 小帆子
*/
@Test
public void remove2() {
List<String> list = new ArrayList(initList);
int size = list.size();
for (int i = 0; i < size; i++) {
String str = list.get(i);
if (str.startsWith("李")) {
list.remove(i);
}
}
System.out.println(list);
}
结果:下标越界
size 变量是固定的,但 list 的实际大小是不断减小的,而 i 的大小是不断累加的,一旦 i >= list 的实际大小肯定就异常了
普通 for 循环倒序删除(可用)
/**
* 普通 for 循环倒序删除
* @author: 小帆子
*/
@Test
public void remove3() {
List<String> list = new ArrayList(initList);
for (int i = list.size() - 1; i > 0; i--) {
String str = list.get(i);
if (str.startsWith("李")) {
list.remove(i);
}
}
System.out.println(list);
}
结果:[张三, 周一, 刘四]
增强 for 循环删除
/**
* 增强 for 循环删除
* @author: 小帆子
*/
@Test
public void remove3() {
List<String> list = new ArrayList(initList);
for (String element : list) {
if (element.startsWith("李")) {
list.remove(element);
}
}
System.out.println(list);
}
结果:java.util.ConcurrentModificationException(并发修改异常)
取下个元素的时候都会去判断要修改的数量(modCount)和期待修改的数量(expectedModCount)是否一致,不一致则会报错,而 ArrayList 中的 remove 方法并没有同步期待修改的数量(expectedModCount)值,所以会抛异常了
迭代器循环迭代器删除(可用)
/**
* 迭代器循环删除(iterator.remove)
* @author: 小帆子
*/
@Test
public void remove4() {
List<String> list = new ArrayList(initList);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String str = iterator.next();
if (str.contains("李")) {
iterator.remove();
}
}
System.out.println(list);
}
结果:[张三, 周一, 刘四]
迭代器中的 remove 方法将期待修改的数量(expectedModCount)值进行了同步
迭代器循环集合删除
/**
* 迭代器循环删除(list.remove)
* @author: 小帆子
*/
@Test
public void remove5() {
List<String> list = new ArrayList(initList);
for (Iterator<String> ite = list.iterator(); ite.hasNext(); ) {
String str = ite.next();
if (str.contains("李")) {
list.remove(str);
}
}
System.out.println(list);
}
结果:java.util.ConcurrentModificationException(并发修改异常)
集合 forEach 方法循环删除
/**
* list.forEach 删除
* @author: 小帆子
*/
@Test
public void remove6() {
List<String> list = new ArrayList(initList);
list.forEach((e) -> {
if (e.contains("李")) {
list.remove(e);
}
});
System.out.println(list);
}
结果:java.util.ConcurrentModificationException(并发修改异常)