public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("张三");
set.add("里斯");
set.add("王五");
set.add(null);
//错误的方法
for (String s : set) {
if ("张三".equals(s)){
set.remove(s);
}
}
}
}
上述的遍历删除时会报一个java.util.ConcurrentModificationException
异常
正确做法
方法1:
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("张三");
set.add("里斯");
set.add("王五");
set.add(null);
//正确的做法
while (iterator.hasNext()){
String next = iterator.next();
if ("张三".equals(next)){
iterator.remove();
}
}
set.forEach(System.out::println);
}
}
方法2:
set.removeIf("张三"::equals);
其实方法2和方法1是一样的,看底层源码就知道了
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}