刪除正在循環迭代的集合元素的分析

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

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章