1、for 循环倒序删除
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
CopyOnWriteArrayList<String> copyList = new CopyOnWriteArrayList<>(list);
// 通过下标删除
for(int i=list.size()-1;i>=0;i--) {
if ("1".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list.toString());
// 也可以通过对象删除
for(int i=copyList.size()-1;i>=0;i--) {
String s = copyList.get(i);
if ("1".equals(s) {
copyList.remove(s);
}
}
System.out.println(copyList.toString());
}
2、使用增强 for 删除
使用增强 for 删除,要使用 CopyOnWriteArrayList,使用 List 会报错。
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
CopyOnWriteArrayList<String> copyList = new CopyOnWriteArrayList<>(list);
// 通过增强 for 删除
for(String s : copyList) {
if ("1".equals(s)) {
copyList.remove(s);
}
}
System.out.println(copyList.toString());
}
3、使用迭代器删除
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
// 使用迭代器删除
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String s = iterator.next();
if ("1".equals(s)) {
iterator.remove();
}
}
System.out.println(copyList.toString());
}
4、Lambda 表达式方法(jdk8)
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
// 使用 jdk8 新方法
list.removeIf(item -> "1".equals(item));
System.out.println(copyList.toString());
}
其实 removeIf 方法内部使用的也是迭代器删除,源码如下:
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;
}