Java ArrayList如何删除多个元素
例如,往ArrayList中添加1到50的整数,然后删除所有的偶数。
几种易错的方法和可行的方法如下:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @description: TODO
* @version: 1.0
* @author: anyue.long
* @date: 2022/10/11 18:33
*/
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
list.add(i);
}
System.out.println("原始数据:");
list.forEach(i -> System.out.print(i + " "));
// // IndexOutOfBoundsException
// int n = list.size();
// for (int i = 0; i < n; i++) {
// if (list.get(i) % 2 == 0) {
// list.remove(i);
// }
// }
// // ConcurrentModificationException
// Iterator<Integer> iter = list.iterator();
// while (iter.hasNext()) {
// Integer i = iter.next();
// if (iter.next() % 2 == 0) {
// list.remove(i);
// }
// }
// // ConcurrentModificationException
// for (Integer i : list) {
// if (i % 2 == 0) {
// list.remove(i);
// }
// }
// // 没有异常,但是后面的元素会依次往前面覆盖,会有漏网之鱼,结果就不对
// for (int i = 0; i < list.size(); i++) {
// if (list.get(i) % 2 == 0) {
// list.remove(i);
// }
// }
// // 正确
// Iterator<Integer> iter = list.iterator();
// while (iter.hasNext()) {
// Integer i = iter.next();
// if (i % 2 == 0) {
// iter.remove();
// }
// }
// // 正确
list.removeIf(i -> i % 2 == 0);
System.out.println("\n删除偶数后:");
list.forEach(i -> System.out.print(i + " "));
}
}
添加500万条数据,针对可行的方法,测试删除效率,结果如下:
removeIf,耗时74ms!
list.removeIf(i -> i % 2 == 0);
另外 Iterator 的方式,我等了好久都没运行结束!没耐心了,把数据减到50万,测试结果如下:
使用 Iterator,耗时9170ms!
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
Integer i = iter.next();
if (i % 2 == 0) {
iter.remove();
}
}
此时 removeIf 只需要25ms!