神仙也難逃Java開發之增強for循環

什麼是增強for循環

增強for循環是一種簡單模式的for循環,爲了方便數組和集合的遍歷而存在。

int[] arr = new int[]{
   
   1, 2, 3, 4, 5, 6};
        for (int a : arr) {
   
   
            System.out.println(a);
        }

        ArrayList<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        for (int i : list) {
   
   
            System.out.println(i);
        }//加入Java開發交流君樣:756584822一起吹水聊天

增強for循環的原理

對於集合的遍歷,增強for循環其實內部是通過迭代器實現的,可以做一個簡單的驗證,我們知道在迭代器中,迭代的時候不允許修改,不然會拋出ConcurrentModificationException異常,那我們不妨在增強型for循環中也嘗試去修改集合中的對象,看是否拋出同樣的異常。

ArrayList<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        for (int i : list) {
   
   
            if(i == 4)list.add(1024);
            System.out.println(i);
        }//加入Java開發交流君樣:756584822一起吹水聊天

將上述集合for循環遍歷中加入一行add對象的代碼,運行確實會拋出異常。拋出的異常如下:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at Test.main(Test.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
//加入Java開發交流君樣:756584822一起吹水聊天

從上述異常的描述中可以看出,其中的確調用了Itr.next方法,所以內部是通過Iterator實現遍歷的。

慎用增強型for循環之可能陷阱

  • 增強型for循環不支持遍歷時修改
  • 使用增強型for循環時,對遍歷的集合需要做null判斷,不然可能引發空指針異常

image

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:756584822

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