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

1.倒序删

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

 
  1. public static void remove(List 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 list, String target) {

  2. final CopyOnWriteArrayList cowList = new CopyOnWriteArrayList(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 list, String target) {

  2. Iterator 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 list, String target) {

  2. for (String item : list) {

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

  4. list.remove(item);

  5. break;

  6. }

  7. }

  8. }

你可能感兴趣的:(ArrayLIst删除元素)