删除正在循环迭代的集合元素的分析

来源:互联网 发布:网络视频转换器 编辑:程序博客网 时间:2024/05/18 02:17

public class IteratorTest {

 

    public static void main(String[] args) {

      

       //List的元素不能使用原集合删除,一定要使用迭代器删除

       List<String> list = new ArrayList<String>();

      

       list.add("Hello");

       list.add("world");

       list.add("helloWorld");

       list.add("helloWorld2");

//=======================可以正常操作的情况=========================================================================   

//     1,通过迭代器删除:ok

//     for (Iterator iterator = list.iterator(); iterator.hasNext();) {

//         String string = (String) iterator.next();

//         System.out.println(string);

//         iterator.remove();

//     }

//     System.out.println(list.size());

      

//========================异常情况及分析======================================================      

// 1,直接remove Object发发生异常:java.util.ConcurrentModificationException

// 第一次循环时,可以正常删除(因为这时的list还没有改变);第二次循环时,再删除就会报异常。

// 如果只有两个元素,删除一次后就不再循环,所以不会报异常。

//  AbstractList的方法(每次循环时都会调用这个方法,先判断,再往下循环,所以如何集合改变了,就。。。。):

//     final void checkForComodification() {

//         if (modCount != expectedModCount)

//         throw new ConcurrentModificationException();

//     }

//     for(String s:list)

//     {

//         System.out.println(s);

//         list.remove(s);

//     }

      

      

//2,异常类型:java.lang.IndexOutOfBoundsException

//由于面向对象的性质决定的,删除后,正在的迭代的集合中后面的元素就会补上来

//     for(int i=0,size=list.size();i<size;i++)

//     {

//         System.out.println(list.get(i));

//         list.remove(list.get(i));

//     }

      

//3,或者如下;这种不会报异常,但是却不是想要的结果。原因还是删除当前元素后,后面的元素会马上补上来。

//     for(int i=0;i<list.size();i++)

//     {

//         System.out.println(list.get(i));

//         list.remove(list.get(i));

//     }

// 4,再或者如下:  跟上面的情况一样。  

       for(int i=0;i<list.size();i++)

       {

           System.out.println(list.get(i));

           list.remove(i);

       }

    }

}

 

 

 

参考:http://leepoint.net/notes-java/flow/loops/foreach.html

<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:黑体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimHei;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:1 135135232 16 0 262144 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:Verdana;panose-1:2 11 6 4 3 5 4 4 2 4;mso-font-charset:0;mso-generic-font-family:swiss;mso-font-pitch:variable;mso-font-signature:536871559 0 0 0 415 0;}@font-face{font-family:"/@黑体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;}h2{mso-style-next:正文;margin-top:13.0pt;margin-right:0cm;margin-bottom:13.0pt;margin-left:49.6pt;text-align:justify;text-justify:inter-ideograph;text-indent:-1.0cm;line-height:173%;mso-pagination:lines-together;page-break-after:avoid;mso-outline-level:2;mso-list:l0 level2 lfo1;tab-stops:list 49.6pt;font-size:16.0pt;font-family:Arial;mso-fareast-font-family:黑体;mso-bidi-font-family:"Times New Roman";mso-font-kerning:1.0pt;}h3{mso-style-next:正文;margin-top:13.0pt;margin-right:0cm;margin-bottom:13.0pt;margin-left:70.9pt;text-indent:-1.0cm;line-height:173%;mso-pagination:lines-together;page-break-after:avoid;mso-outline-level:3;mso-list:l0 level3 lfo1;tab-stops:list 70.9pt;font-size:16.0pt;font-family:"Times New Roman";mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:612.0pt 792.0pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:36.0pt;mso-footer-margin:36.0pt;mso-paper-source:0;}div.Section1{page:Section1;} /* List Definitions */ @list l0{mso-list-id:1020426243;mso-list-template-ids:-865962576;}@list l0:level1{mso-level-text:%1;mso-level-tab-stop:21.25pt;mso-level-number-position:left;margin-left:21.25pt;text-indent:-21.25pt;}@list l0:level2{mso-level-style-link:"标题 2";mso-level-text:"%1/.%2";mso-level-tab-stop:49.6pt;mso-level-number-position:left;margin-left:49.6pt;text-indent:-1.0cm;}@list l0:level3{mso-level-style-link:"标题 3";mso-level-text:"%1/.%2/.%3";mso-level-tab-stop:70.9pt;mso-level-number-position:left;margin-left:70.9pt;text-indent:-1.0cm;}@list l0:level4{mso-level-text:"%1/.%2/.%3/.%4";mso-level-tab-stop:99.2pt;mso-level-number-position:left;margin-left:99.2pt;text-indent:-35.4pt;}@list l0:level5{mso-level-text:"%1/.%2/.%3/.%4/.%5";mso-level-tab-stop:127.55pt;mso-level-number-position:left;margin-left:127.55pt;text-indent:-42.5pt;}@list l0:level6{mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6";mso-level-tab-stop:163.0pt;mso-level-number-position:left;margin-left:163.0pt;text-indent:-2.0cm;}@list l0:level7{mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7";mso-level-tab-stop:191.35pt;mso-level-number-position:left;margin-left:191.35pt;text-indent:-63.8pt;}@list l0:level8{mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8";mso-level-tab-stop:219.7pt;mso-level-number-position:left;margin-left:219.7pt;text-indent:-70.9pt;}@list l0:level9{mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8/.%9";mso-level-tab-stop:255.1pt;mso-level-number-position:left;margin-left:255.1pt;text-indent:-85.0pt;}ol{margin-bottom:0cm;}ul{margin-bottom:0cm;}-->

1        General Form

The for-eachand equivalent for statements have these forms. The two basic equivalentforms are given, depending one whether it is an array or an Iterablethat is being traversed. In both cases an extra variable is required, an indexfor the array and an iterator for the collection.

For-each loop

Equivalent for loop

for (type var : arr) {

    body-of-loop

}

for (int i = 0; i < arr.length; i++) {

    type var = arr[i];

    body-of-loop

}

for (type var : coll) {

    body-of-loop

}

for (Iterator<type> iter = coll.iterator(); iter.hasNext(); ) {

    type var = iter.next();

    body-of-loop

}