精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么推薦使用For-Each而不是For循環遍歷元素?

開發 前端
for循環是平時寫代碼用的最多的,但是之前看《Effective java》,大佬在某些場景寫并不推薦。結合著自己之前刷算法題的經歷,受益匪淺。

 [[383743]]

for循環是平時寫代碼用的最多的,但是之前看《Effective java》,大佬在某些場景寫并不推薦。結合著自己之前刷算法題的經歷,受益匪淺。

一、for循環的缺點

在以往遍歷元素的時候,我們通常采用以下的形式:

  1. public class Main { 
  2.  public static void main(String[] args) { 
  3.   //1、數組元素 
  4.   int[] num = new int[] {1,2,3,4,5}; 
  5.   //數組的遍歷 
  6.   for(int i=0;i<num.length;i++)  
  7.    System.out.println(num[i]); 
  8.   //2、對象元素 
  9.   ArrayList<Person> lists = new ArrayList<>(); 
  10.   lists.add(new Person("張三")); 
  11.   lists.add(new Person("李四")); 
  12.   lists.add(new Person("愚公要移山")); 
  13.   //對象元素的遍歷 
  14.   for(Iterator<Person> it=lists.iterator();it.hasNext();) { 
  15.    Person p = it.next(); 
  16.    System.out.println(p.getName()); 
  17.   } 
  18.  } 

這種寫法看起來還不錯,但是卻并不完美。我們來分析一下,有什么缺點。然后給出解決方案。

問題1:迭代器或索引多次出現,容易造成使用錯誤

從上面兩種遍歷的代碼上來看,對于數組元素是通過索引i來遍歷的,但是整個for循環出現了四次i,對于對象元素是通過迭代器it來遍歷的,但是整個for循環出現了三次it。在for循環遍歷元素的時候,就有多次機會使用了錯誤的變量。而且有時候這些錯誤編譯器無法發現。對整個應用系統造成無法預知的錯誤。

問題2:遍歷對象元素時,需要注意容器類型

比如我們這里使用的是list,當然還有可能是其他容器類型,這些類型在更改時比較麻煩。

問題3:嵌套迭代拋出異常

這種情況比較復雜一些,先來搞個例子。比如說,我們想要列舉每種花,這些花有兩種屬性一種是顏色,一種是大小。

  1. public class Main { 
  2.  //枚舉顏色和尺寸 
  3.  enum Color { RED, GREEN, BLUE, BLACK } 
  4.  enum Size { ONE, TWO, THREE, FOUR, FIVE, 
  5.     SIX, SEVEN, EIGHT,NINE, TEN} 
  6.  //定義花 
  7.  static class Flower{ 
  8.   public Flower(Color color, Size size) {} 
  9.  } 
  10.  public static void main(String[] args) { 
  11.   Collection<Color> colors = Arrays.asList(Color.values()); 
  12.   Collection<Size> sizes = Arrays.asList(Size.values()); 
  13.   List<Flower> flowers = new ArrayList<>(); 
  14.   //for循環添加所有的花和尺寸 
  15.   for (Iterator<Color> color = colors.iterator(); color.hasNext(); ) { 
  16.    for (Iterator<Sizesize = sizes.iterator(); size.hasNext(); ) { 
  17.     flowers.add(new Flower(color.next(), size.next())); 
  18.    }  
  19.   }  
  20.  } 

看似人畜無害,現在我們運行一波。

  1. Exception in thread "main" java.util.NoSuchElementException 
  2.  at java.util.AbstractList$Itr.next(Unknown Source) 
  3.  at com.f2.Main.main(Main.java:25) 

是不是感覺有點奇怪,好像雙重循環遍歷沒啥問題,但是出現了異常,原因是外部的Color迭代器調用了多次,第一層for循環被調用了,但是又在第二層for循環內部被調用了,所以color的next被調用完了。所以出現了NoSuchElementException。但是有時候也不會出現這種情況,場景是外部循環迭代器調用的次數剛好是內部調用的n倍。

問題4:嵌套迭代不拋異常,但是結果不正確

這種情況是外部循環迭代器調用的次數剛好是內部調用的n倍。我們再來個例子:

  1. public class Main { 
  2.  //枚舉顏色 
  3.  enum Color { RED, GREEN, BLUE, BLACK }  
  4.  public static void main(String[] args) { 
  5.   Collection<Color> colors = Arrays.asList(Color.values()); 
  6.   //兩層for循環 
  7.   for (Iterator<Color> c1 = colors.iterator(); c1.hasNext(); ) { 
  8.    for (Iterator<Color> c2 = colors.iterator(); c2.hasNext(); ) { 
  9.     System.out.println(c1.next()+" "+c2.next()); 
  10.    }  
  11.   }  
  12.  } 

現在對顏色進行for循環遍歷,一共兩層for循環,因為一共有四種顏色,兩層for循環應該是打印16個結果。現在運行一遍看看結果:

  1. RED RED 
  2. GREEN GREEN 
  3. BLUE BLUE 
  4. BLACK BLACK 

沒錯,確實是打印了四條。原因和問題三是一樣的。有一種方式可以很好地解決這種嵌套的問題。

嵌套迭代問題解決:

直接看代碼。既然是外部的迭代器it在內部使用了,那我在內部和外部之間用一個變量緩存起來不就好了。

  1. public class Main { 
  2.  //枚舉顏色 
  3.  enum Color { RED, GREEN, BLUE, BLACK } 
  4.  public static void main(String[] args) { 
  5.   Collection<Color> colors = Arrays.asList(Color.values()); 
  6.   //for循環 
  7.   for (Iterator<Color> c1 = colors.iterator(); c1.hasNext(); ) { 
  8.    //用一個變量緩存起來 
  9.    Color c = c1.next(); 
  10.    for (Iterator<Color> c2 = colors.iterator(); c2.hasNext(); ) { 
  11.     System.out.println(c+" "+c2.next()); 
  12.    }  
  13.   }  
  14.  } 

現在再來運行,就可以很好地得出16種結果了。這種方式也比較不錯,但是卻不能很好地解決問題1和問題2。因此,為了解決這一現象,大佬Joshua Bloch在書中提出,推薦使用for-each循環來代替for循環。

二、for-each循環

既然作者推薦使用for-each循環,我們看看他有什么好處。是如何解決上面的問題的。

  1. public class Main { 
  2.  //枚舉顏色和尺寸 
  3.  enum Color { RED, GREEN, BLUE, BLACK } 
  4.  enum Size { ONE, TWO, THREE, FOUR, FIVE, 
  5.     SIX, SEVEN, EIGHT,NINE, TEN} 
  6.  //定義花 
  7.  static class Flower{ 
  8.   public Flower(Color color, Size size) {} 
  9.  } 
  10.  public static void main(String[] args) { 
  11.   Collection<Color> colors = Arrays.asList(Color.values()); 
  12.   Collection<Size> sizes = Arrays.asList(Size.values()); 
  13.   List<Flower> flowers = new ArrayList<>(); 
  14.   //for-each循環 
  15.   for (Color color:colors) { 
  16.    for (Size size:sizes ) { 
  17.     flowers.add(new Flower(color, size)); 
  18.    }  
  19.   }  
  20.  } 

看里面的for-each循環。上面的問題就全都解決了。好吧,可能你會感覺,就這?還有一個好處還沒說,再往下看。

for-each 循環不僅允許遍歷集合和數組,還允許遍歷實現 Iterable 接口的任何對象,該接口由單個方法組成。接 口定義如下:

  1. public interface Iterable<E> { 
  2.  // Returns an iterator over the elements in this iterable 
  3.  Iterator<E> iterator(); 

如果必須從頭開始編寫自己的 Iterator 實現,那么實現 Iterable 會有點棘手,但是如果你正在編寫表示一組元素 的類型,那么你應該強烈考慮讓它實現 Iterable 接口,甚至可以選擇不讓它實現 Collection 接口。這允許用戶使用for-each 循環遍歷類型,他們會永遠感激不盡的 。

但是,有三種常見的情況是你不能分別使用 for-each 循環的:

(1)有損過濾(Destructive filtering):如果需要遍歷集合,并刪除指定選元素,則需要使用顯式迭代器,以便可以調用其 remove 方法。通常可以使用在 Java 8 中添加的 Collection 類中的 removeIf 方法,來避免顯式遍歷。

(2)轉換:如果需要遍歷一個列表或數組并替換其元素的部分或全部值,那么需要列表迭代器或數組索引來替換元素的值。

(3)并行迭代:如果需要并行地遍歷多個集合,那么需要顯式地控制迭代器或索引變量,以便所有迭代器或索引變量都可以同步進行 。

如果發現自己處于這些情況中的任何一種,請使用傳統的 for 循環,并警惕本條目中提到的陷阱 。

本文轉載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉載本文請聯系愚公要移山公眾號。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2013-03-25 10:14:18

NginxApache

2020-09-15 09:23:19

C++WindowsC#

2025-05-16 02:00:00

HashMapJava代碼

2021-06-30 12:47:12

標簽HTML分辨率

2021-03-26 11:50:28

Linuxexals

2023-03-01 10:42:58

gRPC服務端設置

2019-04-19 11:56:48

框架AI開發

2023-02-26 11:15:42

緩存循環依賴

2012-10-10 16:52:21

CentOSDebianUbuntu

2021-10-30 19:57:00

HTTP2 HTTP

2021-08-14 09:04:58

TypeScriptJavaScript開發

2017-09-11 19:58:06

PostgreSQLMySQL數據庫

2020-06-02 14:17:55

QWER排列鍵盤打印機

2023-11-02 08:20:54

SocketZygoteAndroid

2020-07-24 09:20:44

MapObject前端

2025-03-04 00:25:55

Go開發者切片

2024-06-24 00:00:00

AVIFJPEG圖像格式

2023-09-29 11:50:10

接口編程代碼

2019-09-24 09:33:53

MySQLB+樹InnoDB

2016-10-11 11:13:15

Linus Torva
點贊
收藏

51CTO技術棧公眾號

blacked蜜桃精品一区| 国产精品suv一区二区69| 日本一区二区三区视频在线| 欧美国产日韩亚洲一区| 成人激情视频在线播放| 久久一级黄色片| 免费成人网www| 欧美一区二区三区视频在线| www.av中文字幕| 日本中文字幕在线视频| 高清视频一区二区| 国产精品视频99| 日本三级2019| 91精品动漫在线观看| 欧美午夜无遮挡| 老司机av福利| 免费一级在线观看播放网址| 国产一区二区网址| 国产91在线播放精品91| 免费在线视频一区二区| 自拍偷拍亚洲图片| 亚洲国产精品成人综合色在线婷婷| 成人免费福利视频| 久久久久久久久久久影院| 国产精品二区不卡| 亚洲欧美中文日韩在线v日本| 日韩精品视频网址| 经典三级一区二区| 午夜电影一区二区| 国产日产欧美一区二区| www.亚洲.com| 久久午夜电影网| 99久久一区三区四区免费| 久久国产香蕉视频| 香蕉久久夜色精品| 午夜精品理论片| 麻豆视频在线免费看| 欧美日韩色图| 亚洲三级av在线| 欧美精品一二区| wwww国产精品欧美| 日韩av网站在线观看| 久久精品国产电影| 欧美 日韩 国产 成人 在线观看| 午夜影院在线播放| 亚洲激情图片小说视频| 一本色道久久99精品综合| 毛片免费在线播放| 91网站黄www| 激情伦成人综合小说| 亚洲高清在线观看视频| 国产乱色国产精品免费视频| 国产欧美精品日韩| 九九这里只有精品视频| 国产一区二区精品福利地址| 欧美日韩综合色| 欧美aⅴ在线观看| 老色鬼在线视频| 午夜精品免费在线观看| 成人免费播放器| 国产高清av在线| 久久久久久久久伊人| 欧美精品一区在线| 国产精品一二三四五区| 久久成人免费日本黄色| 国产一区深夜福利| 精品一区二区三区四| 欧美另类视频| 高清亚洲成在人网站天堂| 久久午夜无码鲁丝片| 色琪琪久久se色| 色噜噜国产精品视频一区二区| 成年人看的免费视频| 国产精品99在线观看| 欧美猛交免费看| 国产精品第一页在线观看| 亚洲国产综合在线看不卡| 8x拔播拔播x8国产精品| 中文字幕免费高清网站| 美女精品自拍一二三四| 成人黄色免费网站在线观看| 精品国产九九九| 成人h动漫精品一区二| 欧美13一14另类| eeuss影院在线观看| 亚洲色图视频免费播放| 国产乱子伦精品无码专区| 男人的天堂免费在线视频| 欧洲人成人精品| 久久无码人妻一区二区三区| 久久久久观看| 国产性猛交xxxx免费看久久| 秋霞欧美一区二区三区视频免费| 极品中文字幕一区| 国产99视频精品免视看7| 国产一区二区在线视频观看| 成人av网在线| 亚洲三级一区| segui88久久综合9999| 欧美在线一二三| 老熟女高潮一区二区三区| 日韩成人一级| 久久成年人视频| 国产无套丰满白嫩对白| 精品在线播放免费| 久久久久se| 超碰porn在线| 一本久久a久久精品亚洲| 亚洲精品视频三区| 欧洲亚洲视频| 久久香蕉频线观| 午夜一区二区三区四区| 国产成人精品免费在线| 亚洲看片网站| 午夜裸体女人视频网站在线观看| 欧美一区二区在线不卡| 亚洲精品一区二区三区影院忠贞| 精品欠久久久中文字幕加勒比| 亚洲欧美日韩爽爽影院| 中文字幕一区二区三区人妻| 久久久久97| 久久久精品久久久| 精品一区二区无码| av成人免费在线观看| 国产成人三级视频| a成人v在线| 亚洲免费电影一区| 国产精品suv一区二区69| 韩国v欧美v亚洲v日本v| 日本一区网站| 激情av在线| 欧美一卡2卡三卡4卡5免费| 亚洲精品国产一区黑色丝袜| 亚洲久久在线| 国产精品区一区| 色婷婷av在线| 欧美一卡二卡在线观看| 中日韩一级黄色片| 日韩成人精品在线观看| 欧洲精品国产| 欧美a免费在线| 欧美中文字幕一二三区视频| 久久精品老司机| 国产欧美综合一区二区三区| 国产成人精品久久久| 性插视频在线观看| 偷拍一区二区三区| 国产二级一片内射视频播放| 国产精品v日韩精品v欧美精品网站| 亚洲综合中文字幕在线| 国产在线一区二区视频| 亚洲国产成人精品视频| 人妻体体内射精一区二区| 婷婷久久一区| 91亚洲永久免费精品| 天堂av资源在线| 国产欧美日韩精品a在线观看| 欧美日韩在线中文| 日韩精品社区| 国产v综合v亚洲欧美久久| 久草在线青青草| 在线观看不卡一区| 99久久精品久久亚洲精品| 久久国产成人午夜av影院| 色哺乳xxxxhd奶水米仓惠香| 日韩欧美久久| 97精品欧美一区二区三区| 日本福利片高清在线观看| 在线视频欧美区| 91久久久久久久久久久久久久 | 欧美日韩国产网站| 在线观看日韩视频| 国产精品一二三四五区| 亚洲影院在线观看| avav在线播放| 国产 日韩 欧美 综合 一区| 国产91精品久久久久久久| 97caocao| 亚洲尤物视频在线| 国产精品扒开腿做爽爽| 另类综合日韩欧美亚洲| 日韩欧美一级在线| 欧美日韩看看2015永久免费| 国产精品久久二区| 人人澡人人添人人爽一区二区| 亚洲国产精品人久久电影| 波多野结衣一二区| 亚洲美女区一区| 中文精品在线观看| 国产在线精品一区二区不卡了 | 18视频在线观看网站| 色婷婷av一区二区三区之一色屋| 99久久99久久精品免费| 国产精品亚洲一区二区三区妖精| 日韩精品视频久久| 久久久精品久久久久久96| 国产区欧美区日韩区| 精品久久99| 午夜精品久久久久久久99热浪潮| 男人天堂手机在线| 日韩av一区二区在线| 国产精品伦一区二区三区| 欧美日韩在线免费观看| 日批在线观看视频| 免费观看在线色综合| 日本福利视频一区| 日本欧美肥老太交大片| 国产91|九色| 黄色网页在线播放| 亚洲欧美在线免费| 亚洲国产综合一区| 欧美三片在线视频观看| 国产成人在线播放视频| 亚洲蜜臀av乱码久久精品蜜桃| 女女互磨互喷水高潮les呻吟| 成人午夜在线播放| 久久久久久久久久一区| 日韩精品国产欧美| 国产极品在线视频| 欧美激情精品久久久六区热门| 天天综合色天天综合色hd| 美女视频免费精品| y111111国产精品久久婷婷| www一区二区三区| 国产精品第10页| 625成人欧美午夜电影| 高清一区二区三区四区五区| a级片国产精品自在拍在线播放| 一区二区亚洲欧洲国产日韩| 日本免费一区二区三区最新| 亚洲第一视频网站| 国产 欧美 自拍| 欧美一级视频精品观看| 一级做a爰片久久毛片16| 欧洲一区二区三区免费视频| 亚洲日本韩国在线| 午夜亚洲国产au精品一区二区| 免费成年人视频在线观看| 国产精品国产三级国产aⅴ入口| 91精品人妻一区二区三区蜜桃欧美| av在线这里只有精品| 麻豆精品国产传媒av| 成人av在线资源网站| 91传媒理伦片在线观看| 成人av在线网| 好吊一区二区三区视频| 久久综合视频网| 美国黄色一级毛片| 久久品道一品道久久精品| av直播在线观看| 久久久久久久久久久黄色| 99久久人妻无码精品系列| 久久日韩精品一区二区五区| 人妻一区二区视频| 国产精品色一区二区三区| 顶级黑人搡bbw搡bbbb搡| 亚洲欧洲韩国日本视频| 国产免费久久久久| 亚洲精品视频免费观看| 久久久精品国产sm调教网站| 亚洲va欧美va人人爽| 日韩免费视频一区二区视频在线观看| 欧美日韩精品二区| www.久久视频| 欧美日本韩国一区二区三区视频| 国产又粗又黄又爽视频| 日韩一区二区免费在线电影| www.色国产| 欧美性色综合网| 国产又黄又粗又猛又爽| 欧美成人一级视频| 日本成人一区二区三区| 在线播放国产一区二区三区| 黄黄的网站在线观看| 午夜精品久久久久久久99热 | 欧美黄污视频| 欧美日韩在线中文| 精品一区二区三区欧美| 亚洲天堂av网站| 久久精品水蜜桃av综合天堂| 搜索黄色一级片| 红桃视频成人在线观看| 国产精品尤物视频| 日韩欧美一区二区免费| 视频福利在线| 日韩欧美中文字幕制服| 无码精品黑人一区二区三区| 在线观看91久久久久久| 在线电影福利片| 欧美一级片免费在线| 亚洲伦理网站| 久久久久无码国产精品一区| 97人人精品| 无码精品a∨在线观看中文| 韩国欧美国产一区| 亚洲国产精品成人综合久久久| 中文字幕一区二区在线播放 | 91久久黄色| 尤物国产在线观看| eeuss鲁片一区二区三区在线观看| 久久日免费视频| 亚洲妇女屁股眼交7| 在线免费av网| 精品一区二区三区四区| 18+激情视频在线| 国产精品99久久久久久人| 97久久超碰| 亚洲一区二区不卡视频| 国产精品最新自拍| 中文字幕第三区| 中文字幕精品在线不卡| 久久久久久福利| 精品视频一区二区三区免费| 少妇人妻偷人精品一区二区 | 国产美女精品久久久| 999国产精品| 久热免费在线观看| 国产91精品欧美| 免费成人美女女在线观看| 色呦呦国产精品| 无码精品视频一区二区三区| 久久99视频精品| 伊人久久综合网另类网站| 欧洲亚洲一区二区| 一区二区久久| 男人日女人bb视频| 国产成人免费高清| 91ts人妖另类精品系列| 日本乱码高清不卡字幕| 色欲久久久天天天综合网| 欧美激情中文网| 国产午夜亚洲精品一级在线| www.久久久| 欧美在线精品一区| 奇米视频7777| 国产精品天美传媒| 最近中文字幕在线观看视频| 亚洲欧洲激情在线| 第84页国产精品| 免费成人深夜夜行视频| 午夜亚洲视频| 久久无码人妻精品一区二区三区| 亚洲午夜久久久久久久久电影网 | 456亚洲精品成人影院| 精品无码久久久久久久动漫| 亚洲激情欧美| 波多野结衣有码| 欧美日韩在线视频首页| 神马久久久久| 国产精品99免视看9| 欧美一区二区三区高清视频| 嫩草影院国产精品| 国产精品久久久久久久久免费樱桃 | 色综合久久久久综合一本到桃花网| 国产精品高潮呻吟久久av无限| 久久91精品| 特级丰满少妇一级| 亚洲色图欧美在线| www.日韩在线观看| 性日韩欧美在线视频| 天堂av一区二区三区在线播放| 日韩精品视频久久| 国产精品理论在线观看| 97成人在线观看| 欧美激情xxxxx| 国产精品香蕉| 好男人www社区| 亚洲欧洲另类国产综合| a在线观看视频| 69视频在线免费观看| 久久最新网址| 99久久99精品| 亚洲超碰精品一区二区| 黄色片在线看| 91在线免费视频| 99在线热播精品免费99热| 国产一区二区三区四区五区六区| 欧美日韩另类一区| 欧美78videosex性欧美| 欧美资源一区| 国产激情视频一区二区三区欧美 | 欧美午夜不卡视频| www.欧美日本韩国| 久久精品国产一区二区三区不卡| 免费成人你懂的| 精品无码免费视频| 中国china体内裑精亚洲片| 国产精品一区二区美女视频免费看| 精品无码一区二区三区爱欲| 久久久久久日产精品| 亚洲成人77777| 国产精品99蜜臀久久不卡二区| 亚洲欧美亚洲| 亚洲自拍偷拍图| 日韩欧美一级二级三级| 国产亚洲一区二区手机在线观看| 青青草综合视频| 国产欧美日韩亚州综合| 欧美一级在线免费观看| 国产精品一二三在线|