精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

aaa黄色大片| 欧美视频在线观看视频| 国产又粗又猛又爽又黄视频| 亚洲一区二区三区| 精品福利一区二区三区| 丁香啪啪综合成人亚洲| 欧美成人三区| 成人国产亚洲欧美成人综合网| 日本精品免费观看| 天天看片中文字幕| 精品国产91| 精品久久久久一区二区国产| 欧美丰满熟妇xxxxx| 丝袜美女在线观看| 中文字幕欧美日本乱码一线二线 | 青春草免费视频| 亚洲精品一级二级三级| 在线综合+亚洲+欧美中文字幕| 男女激情无遮挡| 久久精品视频免费看| 99久久久国产精品| 亚洲综合社区网| 中文字幕精品一区二| 伊人影院久久| 久久精品国产一区| 日本欧美一区二区三区不卡视频| 丁香综合av| 91精品国产综合久久精品图片 | 久久99久久久精品欧美| 精品久久久久久久久久久久久| 亚洲巨乳在线观看| 青青草免费观看免费视频在线| 国产91精品久久久久久久网曝门| 国产噜噜噜噜久久久久久久久| 国产a∨精品一区二区三区仙踪林| 五月激情久久久| 伊人亚洲福利一区二区三区| 亚洲av网址在线| 懂色av一区二区| 精品免费日韩av| 红桃视频一区二区三区免费| 亚洲成av在线| 日本高清不卡aⅴ免费网站| 国产精品12345| 精品精品导航| 亚洲一区av在线| www.亚洲成人网| caoporm免费视频在线| 中文字幕一区二区三区不卡| 亚洲精品视频一区二区三区| 国产一级片在线播放| 91麻豆高清视频| 久久影视中文粉嫩av| 亚州视频一区二区三区| 91丨九色丨黑人外教| 国新精品乱码一区二区三区18| 蜜臀久久99精品久久久| 成人性视频免费网站| 鬼打鬼之黄金道士1992林正英| 亚洲成人777777| 成人av免费观看| 精品日韩美女| 九色视频在线观看免费播放| 国产欧美日韩综合精品一区二区| 色噜噜一区二区| 91在线网址| 日韩毛片一二三区| japanese在线播放| 在线观看操人| 亚洲成人综合在线| 免费在线观看毛片网站| 亚洲成人av观看| 欧美男女性生活在线直播观看| 天天做天天干天天操| 深夜激情久久| 日韩成人在线视频观看| av网站免费在线看| 国产高清欧美| 97在线视频免费看| 亚洲天堂视频在线播放| 极品尤物av久久免费看| 国产精品白丝jk白祙| 日本一本草久在线中文| 日本一区二区三区四区 | 精品人妻无码一区二区三区 | 国产精品成人3p一区二区三区| 日韩精品一区二区三区蜜臀 | 4p变态网欧美系列| 国产偷人爽久久久久久老妇app | av免费不卡国产观看| 色婷婷久久久久swag精品 | 国产一线二线三线女| 高清不卡av| 制服丝袜av成人在线看| 中出视频在线观看| 国产精品成久久久久| 国内精品久久影院| 91成年人视频| 91丨九色丨尤物| 99久re热视频精品98| 欧美1级2级| 日韩欧美一区中文| 中国女人特级毛片| 精品96久久久久久中文字幕无| 国产精品免费在线免费| 欧洲精品久久一区二区| 国产精品麻豆久久久| 国产综合av在线| 国产一区二区三区视频在线| 亚洲精品网站在线播放gif| 国产av无码专区亚洲av毛网站| 久久久国产精品一区二区中文| 91原创国产| 97视频在线观看网站| 色综合天天综合网国产成人综合天| 天天久久综合网| 成人一区二区| 欧美一区二区三区免费视| 国产精品国产三级国产普通话对白 | 艳母动漫在线看| 有坂深雪av一区二区精品| 91女神在线观看| 国产精品亚洲二区| 91成人在线观看国产| 亚洲精品久久久蜜桃动漫| 亚洲欧美在线高清| 在线免费视频a| 蜜臀久久99精品久久一区二区| 久久久久亚洲精品| 国产jzjzjz丝袜老师水多| 国产精品乱子久久久久| 中文字幕第21页| 国产探花一区二区| 日本成人免费在线| 亚州精品国产精品乱码不99按摩| 亚洲一二三级电影| 四虎成人在线播放| 亚洲欧洲中文字幕| 成人性生交大片免费观看嘿嘿视频| 福利片在线观看| 色妹子一区二区| 婷婷色一区二区三区| 性高湖久久久久久久久| 久久精品国产精品国产精品污| 538在线观看| 欧美精品一区二区不卡| 国产一级一片免费播放放a| 国产精品自拍毛片| 国产91视频一区| 亚洲乱码一区| 久久久久久网址| 日本毛片在线观看| 精品国产成人在线| 少妇精品一区二区三区| 日韩国产精品91| 亚洲不卡1区| 精品亚洲美女网站| 日韩性xxxx爱| www.国产.com| 午夜一区二区三区在线观看| 99久久国产精| 日韩中文字幕91| 一区二区三区av| 欧美影院精品| 91精品国产高清久久久久久久久| 亚洲 欧美 自拍偷拍| 在线看不卡av| 日韩av手机在线免费观看| 国产福利精品一区| av高清在线免费观看| 国产一区二区三区不卡视频网站| 国产精品久久久久久久9999| 国产在线激情视频| 亚洲精品一区二区三区影院| 成人在线免费看视频| 中文字幕国产一区| 国产91在线免费观看| 国产深夜精品| 夜夜爽99久久国产综合精品女不卡| 91精品视频一区二区| 久久久影视精品| 户外极限露出调教在线视频| 7777精品伊人久久久大香线蕉最新版| 欧美日韩一级大片| 久久久综合视频| 成年人网站av| 国产精品美女久久久浪潮软件| 亚洲精品在线免费看| 97久久综合区小说区图片区| 国产精品1区2区在线观看| 国产黄色小视频在线| 日韩激情av在线播放| 国产又黄又粗又硬| 欧美视频在线视频| 2025国产精品自拍| 久久久久久久久久久黄色| 亚洲一二区在线观看| 美女爽到呻吟久久久久| 久久久久久久久久久综合| 久久av免费看| 国产chinese精品一区二区| 亚洲伦乱视频| 97av视频在线| 天使と恶魔の榨精在线播放| 亚洲午夜色婷婷在线| 亚洲国产精品久久久久爰性色| 日本韩国一区二区| 激情综合网五月婷婷| 亚洲欧美日本韩国| 国产一区二区三区四区五区六区| 国产69精品久久99不卡| 玖玖爱视频在线| 久久综合网络一区二区| 少妇人妻无码专区视频| 综合一区av| 亚洲人体一区| 欧美日韩一区二区综合 | 亚洲丝袜美腿一区| 成人自拍爱视频| а天堂中文最新一区二区三区| 国产精品 欧美在线| 不卡专区在线| 欧美激情图片区| 超碰在线网址| 日韩中文在线视频| yourporn在线观看视频| 亚洲精品永久免费精品| 婷婷视频在线观看| 欧美xxxx在线观看| 国产aⅴ爽av久久久久成人| 欧美精品自拍偷拍| 中文字幕网址在线| 欧美羞羞免费网站| 懂色av蜜臀av粉嫩av喷吹| 色播五月激情综合网| 欧美精品一二三四区| 欧美午夜美女看片| 日韩激情在线播放| 疯狂做受xxxx欧美肥白少妇| 五月天婷婷综合网| 精品国产户外野外| 男人天堂av在线播放| 一本到不卡免费一区二区| 日韩免费视频一区二区视频在线观看| 精品国产福利视频| 人人干人人干人人干| 精品毛片三在线观看| 欧美特黄aaaaaa| 欧美丝袜美女中出在线| 日本视频在线观看免费| 色成年激情久久综合| 亚洲视频久久久| 欧美精品日日鲁夜夜添| 国产精品无码在线播放| 日韩欧美一二三四区| 成人免费视频国产| 亚洲缚视频在线观看| 日韩一区二区三区中文字幕| 亚洲欧美一区二区三区在线| jizz日韩| 久久伊人免费视频| 欧美1—12sexvideos| 91成品人片a无限观看| 日本久久免费| 国产日韩欧美电影在线观看| 精品欧美视频| 国产一区二区三区四区hd| 九九热爱视频精品视频| 老司机av福利| 亚洲狠狠婷婷| 久久久久免费精品| 国产一区在线不卡| 国产一级黄色录像| 国产欧美日本一区二区三区| 亚洲女人久久久| 亚洲国产精品久久久久秋霞影院| 国产精品国产三级国产专区52| 色婷婷精品久久二区二区蜜臀av| 亚洲天堂中文字幕在线| 欧美v日韩v国产v| 日本大臀精品| 久久久精品久久久| 欧美久久天堂| 成人福利免费观看| 神马日本精品| 麻豆md0077饥渴少妇| 国产精品日本欧美一区二区三区| 天天干天天草天天| 成人的网站免费观看| 5566中文字幕| 欧美午夜视频在线观看| 国产又色又爽又黄又免费| 亚洲国产精品久久精品怡红院| 成人资源www网在线最新版| 欧美日韩999| 成人黄色毛片| 好吊妞www.84com只有这里才有精品| 成人精品久久| 国产美女主播在线播放| 狠狠色狠狠色综合系列| 中文字幕av网址| 亚洲一二三四在线观看| 中文字幕在线观看欧美| 精品国产1区二区| 看女生喷水的网站在线观看| 热99在线视频| 91精品短视频| 黄瓜视频免费观看在线观看www| 亚洲少妇诱惑| 娇妻高潮浓精白浆xxⅹ| 一区免费观看视频| 久久久久精彩视频| 亚洲精品天天看| 丰满的护士2在线观看高清| 国产一区二区在线免费| 亚洲免费福利一区| 亚洲理论电影在线观看| 国产一区在线精品| 91香蕉视频网| 欧洲一区二区三区免费视频| 涩涩视频在线观看免费| 国内精品视频一区| 亚洲一区二区电影| 水蜜桃在线免费观看| 久久精品国产精品亚洲综合| 真实乱视频国产免费观看| 欧美日韩亚洲视频一区| 欧美一级特黄aaaaaa| 久久久久久午夜| eeuss鲁片一区二区三区| 日韩最新中文字幕| 久久精品99国产精品日本| 日本爱爱爱视频| 日本道在线观看一区二区| 日韩国产福利| 青青青国产精品一区二区| 首页亚洲中字| 波多野结衣50连登视频| 99久久国产综合色|国产精品| 国产亚洲精久久久久久无码77777| 欧美精品色综合| 秋霞a级毛片在线看| 成人免费观看a| 亚洲破处大片| 无码av免费精品一区二区三区| 亚洲一区二区三区四区在线免费观看 | 91精品国产欧美一区二区18| 岛国中文字幕在线| 99久久无色码| 在线电影一区| 法国伦理少妇愉情| 欧美亚洲国产一卡| 欧美黑人激情| 91久久国产综合久久蜜月精品| 欧美激情日韩| 国产不卡一二三| 色综合久久久久综合体| 国产尤物视频在线| 国产乱人伦真实精品视频| 性xxxx欧美老肥妇牲乱| 粗大的内捧猛烈进出视频| 亚洲v中文字幕| 男女视频在线观看免费| 国产精品毛片a∨一区二区三区|国| 精品视频97| 中文字幕第66页| 亚洲成人av免费| 每日更新在线观看av| 国产欧美一区二区白浆黑人| 午夜性色一区二区三区免费视频 | 国偷自产av一区二区三区| 欧美三级一级片| 欧美国产精品v| 亚洲国产www| 日本精品一区二区三区在线播放视频| 日韩电影免费在线观看| 欧美国产日韩在线视频| 亚洲韩国精品一区| jzzjzzjzz亚洲成熟少妇| 成人欧美一区二区三区视频| 午夜亚洲性色福利视频| 99热这里只有精品4| 亚洲经典中文字幕| 韩国精品视频在线观看| a级免费在线观看| 日本一区二区三区四区| 成人免费一级视频| 国产精品91久久久久久| 狠狠综合久久| 懂色av蜜桃av| 亚洲国产精品免费| 亚洲综合资源| 国产偷人视频免费| 亚洲猫色日本管| 国产一区二区三区福利| 国产aⅴ精品一区二区三区黄| 日韩电影在线免费| 国产真人真事毛片| 精品国产区一区二区三区在线观看| 国产亚洲精品美女久久|