public class ListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("11");
list.add("22");
list.add("22");
list.add("33");
list.add("44");
System.out.println(list);
//remove(list,"22");
List list1 = copyOnWriteArrayListRemove(list, "22");
System.out.println(list1);
}
常见错误
//错误 java.util.ConcurrentModificationException 会产生并发问题
private static void remove(List<String> list, String s) {
for (String s1 : list) {
if(s.equals(s1)){
list.remove(s1);
}
}
}
//错误 删除不完整 运行结果[11, 22, 33, 44] s="22"
//(1)index 0 1 2 3 4
//原因 由于[11, 22, 22, 33, 44]集合开始长度为5,当集合遍历到1时,item="22"进行删除该元素,
// (2)index 0 1 2 3
// 并且该集合元素总体往前挪一位[11, 22, 33, 44] i=1 ===>> i++之后 i = 2;所以item得到的值 list.get(i)为"33"把第二个"22"给忽略掉
private static void remove(List<String> list, String s) {
for(int i = 0; i < list.size(); i++){
String item = list.get(i);
if(s.equals(item)){
list.remove(item);
}
}
}
正确操作(如下)
//正确 运行结果[11, 33, 44]
private static void remove(List<String> list, String s) {
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String s1 = iterator.next();
if(s.equals(s1)){
iterator.remove();
}
}
}
//正确 运行结果[11, 33, 44]
private static void remove(List<String> list, String s) {
for (int i = list.size() - 1; i >= 0; i--){
String s1 = list.get(i);
if (s.equals(s1)){
list.remove(s);
}
}
}
//正确 java8 使用lambda表达式删除列表元素 运行结果[11, 33, 44]
private static void remove(List<String> list, String s) {
//lambda表达式的方法
list.removeIf(e -> s.equals(e));
}
//正确 运行结果[11, 33, 44]
private static List copyOnWriteArrayListRemove(List<String> list, String s){
CopyOnWriteArrayList<String> cList = new CopyOnWriteArrayList<>(list);
for (String s1 : cList) {
if (s.equals(s1)){
cList.remove(s1);
//注意别这样删除,java.util.ConcurrentModificationException 会产生并发问题
//list.remove(s1);
}
}
return cList;
}}