文章目录
常见错误代码
1. 在foreach遍历集合的同时删除集合中的元素
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class User{
private String name;
User(String name){
this.name=name;
}
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User a = new User("A");
User b = new User("B");
User c = new User("C");
User[] u = {a, b, c};
users.addAll(List.of(u));
Collections.addAll(users, u);
users.forEach(i -> System.out.println(i.getName()));
for (User i : users){ //代码重点!!
if (i.getName() == "B"){
users.remove(i);
}
}
}
}
执行结果:报错
A
B
C
A
B
C
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
at Test.main(Test.java:23)
Process finished with exit code 1
2. 使用基本for循环
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class User{
private String name;
User(String name){
this.name=name;
}
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User a = new User("A");
User b = new User("B");
User c = new User("C");
User[] u = {a, b, c};
users.addAll(List.of(u));
users.add(1,b);
users.forEach(i -> System.out.println(i.getName()));
for (int i=0;i<users.size();i++){ //代码重点!!
if (users.get(i).getName() == "B"){
users.remove(i);
}
}
System.out.println("______");
users.forEach(i -> System.out.println(i.getName()));
}
}
执行结果:虽然没有报错,但也没有将name为B的对象全部删除
A
B
B
C
______
A
B
C
Process finished with exit code 0
正确代码(示例)
1. 通过迭代器实现可移除的遍历
代码:
import java.util.*;
class User{
private String name;
User(String name){
this.name=name;
}
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User a = new User("A");
User b = new User("B");
User c = new User("C");
User[] u = {a, b, c};
users.addAll(List.of(u));
users.add(1,new User("B"));
users.forEach(i -> System.out.println(i.getName()));
Iterator<User> it = users.iterator(); //代码重点!!
while (it.hasNext()){
User i = it.next();
if (i.getName() == "B"){
it.remove();
}
}
System.out.println("------");
users.forEach(i -> System.out.println(i.getName()));
}
}
执行结果:
A
B
B
C
------
A
C
Process finished with exit code 0
2. 基于集合stream流,结合Lambda表达式实现
代码:
import java.util.*;
import java.util.stream.*;
class User{
private String name;
User(String name){
this.name=name;
}
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User a = new User("A");
User b = new User("B");
User c = new User("C");
User[] u = {a, b, c};
users.addAll(List.of(u));
users.add(1,new User("B"));
users.forEach(i -> System.out.println(i.getName()));
users = users.stream().filter(i -> i.getName() != "B").collect(Collectors.toList()); //代码重点!!
System.out.println("------");
users.forEach(i -> System.out.println(i.getName()));
}
}
执行结果:
A
B
B
C
------
A
C
Process finished with exit code 0