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

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-each and equivalent for statements have these forms. The two basic equivalent forms are given, depending one whether it is an array or an Iterable that is being traversed. In both cases an extra variable is required, an index for 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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值