删除ArrayList元素的4种正确方法

本文详细介绍了四种在Java中从List中删除元素的方法:倒序删除、使用CopyOnWriteArrayList线程安全删除、使用迭代器remove方法删除以及在增强for循环中删除。每种方法都有其适用场景和潜在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.倒序删

倒序删不会出现像正序删那样因为删完元素后剩余的元素索引发生改变而遗漏元素并且最终会报 java.lang.IndexOutOfBoundsException 异常的情况。

 
  1. public static void remove(List<String> list, String target) {

  2. for(int i = list.size() - 1; i >= 0; i--){

  3. String item = list.get(i);

  4. if(target.equals(item)){

  5. list.remove(item);

  6. }

  7. }

  8. }

2.CopyOnWriteArrayList线程安全删除

利用 CopyOnWrite 容器。CopyOnWrite 容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对 CopyOnWrite 容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以 CopyOnWrite 容器也是一种读写分离的思想,读和写不同的容器。

 
  1. public static void remove(ArrayList<String> list, String target) {

  2. final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(list);

  3. for (String item : cowList) {

  4. if (item.equals(target)) {

  5. cowList.remove(item);

  6. }

  7. }

  8. }

3.迭代器remove方法删除(推荐)

对于别的 List 实现类来说,要用此法删除元素的前提是该 List 的实现类的 iterator() 方法返回的 Iterator 实现类支持 remove() 方法,否则会报 java.lang.UnsupportedOperationException 异常,常用的 ArrayList 的 Iterator 支持 remove() 方法。

 
  1. public static void remove(List<String> list, String target) {

  2. Iterator<String> iter = list.iterator();

  3. while (iter.hasNext()) {

  4. String item = iter.next();

  5. if (item.equals(target)) {

  6. iter.remove();

  7. }

  8. }

  9. }

4.增强for循环中删除

增强 for 循环中删除元素后继续循环会报 java.util.ConcurrentModificationException 异常,因为元素在使用的时候发生了并发的修改,导致异常抛出,但是删除完毕马上使用 break 跳出,则不会触发报错。

 
  1. public static void remove(List<String> list, String target) {

  2. for (String item : list) {

  3. if (item.equals(target)) {

  4. list.remove(item);

  5. break;

  6. }

  7. }

  8. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值