java中集合删除元素的两种常用方式及新手易错

java中集合删除元素的两种常用方式及新手易错:

创建集合:

[java]  view plain  copy
  1. ArrayList<String> aList = new  ArrayList<String>();  
  2.         aList.add("a");  
  3.         aList.add("b");  
  4.         aList.add("c");  
  5.         aList.add("abc");  
  6.         aList.add("abc");  
  7.         aList.add("abc");  
  8.         aList.add("eye");  
  9.         aList.add("opp");  
  10.         aList.add("abc");  

1、第一种删除方式(利用for循环删除):

[java]  view plain  copy
  1. for (int i = 0; i < aList.size(); i++) {  
  2. if ("abc".equals(aList.get(i))) {  
  3. aList.remove(i--);// 索引回溯  
  4. }  
  5. }  

//和上面一样,换一种方式(易观看)

for (int i = 0; i < aList.size(); i++) {  
   if ("abc".equals(aList.get(i))) {  
       aList.remove(i);
        i--;// 索引回溯  
    }  
}





2、第二种删除方法(利用迭代器的remove()方法删除

[java]  view plain  copy
  1. ListIterator<String> listIterator = aList.listIterator();  
  2.         while(listIterator.hasNext()){  
  3.             String  str = listIterator.next();  
  4.             if ("abc".equals(str)) {  
  5.               //aList.remove(str);   // 集合自身的remove()方法删除  
  6.                 listIterator.remove(); //迭代器的remove() 方法删除  
  7.             }  
  8.         }  

运行结果:

[java]  view plain  copy
  1. 原集合:a b c abc abc abc eye opp abc   
  2. 删除后集合:a b c eye opp   


新手易错点:

1、利用for循环删除时索引没有回溯,导致漏删元素

[java]  view plain  copy
  1. for(int i = 0 ;i < aList.size(); i++){  
  2.             if("abc".equals(aList.get(i))){  
  3.                 aList.remove(i);// 索引回溯  
  4.             }  
  5.         }  

 
 运行结果: 
  
 

[java]  view plain  copy
  1. 原集合:a b c abc abc abc eye opp abc   
  2. 删除后集合:a b c abc eye opp   

2、使用迭代器循环删除元素时,没有利用迭代器remove方法删除元素而是利用集合自身的remove方法删除元素,

这样会导致“并发修改异常错误”

[java]  view plain  copy
  1. ListIterator<String> listIterator = aList.listIterator();  
  2.         while(listIterator.hasNext()){  
  3.             String  str = listIterator.next();  
  4.             if ("abc".equals(str)) {  
  5.                 aList.remove(str);   // 集合自身的remove()方法删除  
  6.             }  
  7.         }  
运行结果:

[java]  view plain  copy
  1. 原集合:a b c abc abc abc eye opp abc   
  2. 删除后集合:Exception in thread "main" java.util.ConcurrentModificationException  
  3.     at java.util.ArrayList$Itr.checkForComodification(Unknown Source)  
  4.     at java.util.ArrayList$Itr.next(Unknown Source)  
  5.     at practice_2.Mianpractice2.main(Mianpractice2.java:42)  


并发修改异常错误的产生是因为在生成迭代器后迭代器就已经确定了集合的长度size了,而后集合删除元素后集合的size变小,但是迭代器任然记录的是之前的size数据在迭代过程中产生并发修改异常ConcurrentModificationException,但是如果是使用迭代器的remove()方法来删除元素的话则不会产出这个问题,因为迭代器中的cursor能够自动适应元素删除后集合大小的变化;

所以在删除集合元素时,如果适应迭代器来循环集合元素一定要使用迭代器自身的remove()方法来删除元素;


转载出处:https://blog.csdn.net/u014143369/article/details/52996154


猜你喜欢

转载自blog.csdn.net/qq_40081976/article/details/80487532
今日推荐