成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中的增強for循環(foreach)的實現原理與坑

開發 開發工具
今天我們來講講Java中的增強for循環(foreach)的實現原理與注意事項。

[[183934]]

在JAVA中,遍歷集合和數組一般有以下三種形式:

  1. for (int i = 0; i < list.size(); i++) { 
  2.     System.out.print(list.get(i) + ","); 
  3.  
  4. Iterator iterator = list.iterator(); 
  5. while (iterator.hasNext()) { 
  6.     System.out.print(iterator.next() + ","); 
  7.  
  8. for (Integer i : list) { 
  9.     System.out.print(i + ","); 

***種是普通的for循環遍歷、第二種是使用迭代器進行遍歷,第三種我們一般稱之為增強for循環(for each)。

可以看到,第三種形式是JAVA提供的語法糖,這里我們剖洗一下,這種增強for循環底層是如何實現的。

我們對以下代碼進行反編譯:

  1. for (Integer i : list) { 
  2.      System.out.println(i); 
  3.  } 

反編譯后:

  1. Integer i; 
  2.    for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){ 
  3.        i = (Integer)iterator.next();         
  4.    } 

反編譯后的代碼其實比較復雜,我們按照執行順序拆解一下:

  • Integer i; 定義一個臨時變量i
  • Iterator iterator = list.iterator(); 獲取List的迭代器
  • iterator.hasNext(); 判斷迭代器中是否有未遍歷過的元素
  • i = (Integer)iterator.next(); 獲取***個未遍歷的元素,賦值給臨時變量i
  • System.out.println(i) 輸出臨時變量i的值

如此循環往復,直到遍歷完List中的所有元素。

通過反編譯,我們看到,其實JAVA中的增強for循環底層是通過迭代器模式來實現的。

既然增強for循環通過迭代器實現,那么必然有迭代器的特性。在Java中的fail-fast機制中有介紹過。在使用迭代器遍歷元素的時候,在對集合進行刪除的時候一定要注意,使用不當有可能發生ConcurrentModificationException,如以下代碼:

  1. for (Student stu : students) {     
  2.     if (stu.getId() == 2)      
  3.         students.remove(stu);     

會拋出ConcurrentModificationException異常。

Iterator是工作在一個獨立的線程中,并且擁有一個 mutex 鎖。 Iterator被創建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,所以當索引指針往后移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出java.util.ConcurrentModificationException異常。

所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象,Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性。

正確的在遍歷的同時刪除元素的姿勢:

  1. Iterator<Student> stuIter = students.iterator();     
  2. while (stuIter.hasNext()) {     
  3.     Student student = stuIter.next();     
  4.     if (student.getId() == 2)     
  5.         stuIter.remove();//這里要使用Iterator的remove方法移除當前對象,如果使用List的remove方法,則同樣會出現ConcurrentModificationException     

 【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2024-08-30 08:43:24

JavaScriptforEachfor循環

2022-08-27 14:42:45

Java集合數組

2023-05-07 23:22:24

golang

2009-08-28 17:18:55

foreach循環

2024-03-11 01:00:00

jsfor循環

2022-12-26 09:27:48

Java底層monitor

2023-12-19 16:43:01

2023-10-10 08:39:25

Java 7Java 8

2020-10-16 08:30:00

foreach編程語言C#

2016-09-29 09:57:08

JavascriptWeb前端模板

2017-07-26 14:50:37

前端模板

2021-12-28 08:17:41

循環 forgo

2023-08-11 17:13:39

JavaScrip

2011-06-13 10:21:25

QT 信號 槽機制

2020-11-30 06:18:21

React

2018-09-12 15:38:42

Javaatomic編程

2013-06-06 13:10:44

HashMap無鎖

2010-07-12 22:19:27

UDP服務

2025-06-06 02:00:00

2022-07-06 11:47:27

JAVAfor循環
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www在线视频| 羞羞网站在线免费观看 | 成人免费观看男女羞羞视频 | 在线一区 | 国产乱码久久久久久 | 精品国产乱码久久久久久88av | 久久久毛片 | 亚洲欧美日韩网站 | 日韩成人在线播放 | 精品成人佐山爱一区二区 | 一区二区av| 国产精品色 | 日本三级线观看 视频 | 国产视频一二三区 | 国产精品成人一区二区三区 | 中文字幕在线观看一区二区 | 爱爱爱av| 正在播放国产精品 | 久久久久久久久国产精品 | 情侣酒店偷拍一区二区在线播放 | 国产午夜视频 | 天天综合久久 | 成人小视频在线观看 | 国产精品久久久久无码av | 亚洲精品国产第一综合99久久 | 欧美成人手机视频 | 在线欧美一区 | 色综合欧美| 欧美精品在线免费 | 992tv人人草 久久精品超碰 | 81精品国产乱码久久久久久 | 精品欧美乱码久久久久久 | 狠狠操av | av免费入口 | 日韩欧美二区 | 一级片av | 一色桃子av一区二区 | 噜噜噜色网 | 另类a v| 国产 日韩 欧美 在线 | 久久99精品久久久水蜜桃 |