随笔 - 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 阅读(2444) 评论(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就尽量用  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: