隨筆 - 17  文章 - 49  trackbacks - 0
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類(17)

          隨筆檔案(17)

          相冊

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          2006 8 15 星期二

          管中窺虎

          在學習 java 1.5 的過程中,我使用了 sun 公布的 tutorial ,這份文檔寫的比較詳盡易明,但是對于想快速了解 tiger 而且具有較好 java 基礎的人來說,大篇幅的英文文檔是比較耗時間和非必需的,所以我將會歸納這份文檔的主要內容,在保證理解的底線上,盡力減少閱讀者需要的時間。

          ?

          在以下地址可以進入各新增語言特色介紹以及下載相關文檔(若有)。

          http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

          ?

          第二道虎紋: For-Each 循環

          目前在一個容器里做迭代訪問挺郁悶的,看看下面這個方法,方法的目的是把容器里的一系列計時任務取消。

          void ?cancelAll(Collection < TimerTask > ?c)? {

          ????
          for ?(Iterator < TimerTask > ?i? = ?c.iterator();?i.hasNext();?)

          ????????i.next().cancel();

          }

          關于

          Iterator 的部分真的很羅嗦,而且容易出錯。現在再看看 1.5 里帶來的 For-each 循環:

          void ?cancelAll(Collection < TimerTask > ?c)?{

          ????
          for ?(TimerTask?t?:?c)

          ????????t.cancel();

          }

          這個新的循環和泛型完美配合,既保持類型安全,又去掉了冗余。

          以下是一個在試圖嵌套迭代的時候經常會犯的錯誤。

          List?suits? = ?;

          List?ranks?
          = ?;

          List?sortedDeck?
          = ? new ?ArrayList();

          ?

          // ?BROKEN?-?throws?NoSuchElementException!

          for ?(Iterator?i? = ?suits.iterator();?i.hasNext();?)

          ????
          for ?(Iterator?j? = ?ranks.iterator();?j.hasNext();?)

          ????????sortedDeck.add(
          new ?Card(i.next(),?j.next()));

          ?

          原因是 i.next() 被過多的調用了。

          再看看新循環的表現,簡直是度身定造一樣的般配。

          for ?(Suit?suit?:?suits)

          ????
          for ?(Rank?rank?:?ranks)

          ????????sortedDeck.add(
          new ?Card(suit,?rank));

          ?

          for-each 循環也適用于數組,象隱藏迭代子一樣,這次它把數組下標藏起來了。

          // ?Returns?the?sum?of?the?elements?of?a

          int ?sum( int []?a)? {

          ????
          int ?result? = ? 0 ;

          ????
          for ?( int ?i?:?a)

          ????????result?
          += ?i;

          ????
          return ?result;

          }

          ?

          那么我們什么時候該用 for-each 循環呢?只要情況運行就應該用,它真的讓你的代碼好看了很多。不幸的是,它有不能發揮作用的情形,就是需要用 iterator remove 方法的時候,因為 iterator 被隱藏了,你也無法調用它的方法了,新的循環不適用于過濾元素。同樣的也不適用于需要把數組中的元素替換掉的情況。最后,它也不能在平行遍歷多個容器的情況里使用,這些缺點,設計者是知道的,但是最后他們明智地選擇這樣一個簡單的,能適用于多數情況的設計方案

          posted on 2006-08-15 18:06 Ye Yiliang 閱讀(2479) 評論(8)  編輯  收藏 所屬分類: Java

          FeedBack:
          # re: 第二道虎紋:For-Each 循環 2006-08-15 20:06 hsp
          僅用于LOOP做讀操作時,我喜歡foreach
          可惜它性能比不上普通for  回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-15 20:15 Ye Yiliang
          關于性能差異,愿聞其詳,有勞講解@hsp
            回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-16 09:43 GoKu
          在.net上用foreach比for要快, java上不清楚會不會快  回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-17 10:57 hsp
          看數組還是鏈表.
          index與iterate的關系

          在c#1.0時,foreach在數組操作上的確比for慢(主要是數組的固定長度,編譯器優化使用內聯的對象記住該長度,并且不做任何越界檢測).
          因此當時我也不太用.

          后期版本的編譯器做了優化.
          在數組時,foreach編譯成普通for
          在鏈表時,(類型提供了迭代器)foreach編譯成使用迭代器.如果使用for利用索引當然會慢.

          但在使用時候,foreach還要看具體迭代器本身實現的效率.  回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-17 11:10 yeyiliang
          不知道java的編譯器在這個方面有沒有做類似的優化:)@hsp
            回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-17 14:53 hsp
          都出到1.5,我林肯定有的..  回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-17 17:52 海藍
          @GoKu
          在.NET中foreach不比for快吧?據我了解,foreach編譯后的代碼與for是一樣的  回復  更多評論
            
          # re: 第二道虎紋:For-Each 循環 2006-08-18 13:52 GoKu
          http://topic.csdn.net/t/20051230/11/4490365.html

          這里有討論

          我記得在哪本書上也說過多數情況下foreach速度比較快,所以在.net中能foreach就盡量用  回復  更多評論
            
          主站蜘蛛池模板: 仁化县| 大余县| 永靖县| 旬邑县| 闸北区| 威远县| 武隆县| 邛崃市| 商丘市| 贵溪市| 定州市| 保定市| 麻江县| 滨州市| 宝山区| 台南县| 蒲江县| 扎兰屯市| 尖扎县| 衡阳市| 沈丘县| 阜城县| 永宁县| 安徽省| 加查县| 正镶白旗| 云安县| 错那县| 东辽县| 醴陵市| 离岛区| 海兴县| 太仆寺旗| 丽水市| 淄博市| 张家港市| 石首市| 屯昌县| 寿宁县| 新昌县| 怀来县|