如下情况,怎么写代码的效率更高?

thinke365 2008-08-26 09:28:14
定义为:
Collection<E> c;
Iterator<E> iter = c.iterator();

现在要求对c中的元素进行遍历,下面两种,哪种效率更高?为什么?

1
while(iter.hasNext()) {
E temp = iter.next();
// some operations
}

2
E temp;
while(iter.hasNext()) {
temp = iter.next();
// some operations
}
...全文
258 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
vamvin_55 2008-08-28
  • 打赏
  • 举报
回复
纯效率来说的话
下面的那个好点...
lawincy 2008-08-28
  • 打赏
  • 举报
回复
这种代码有比较意义没?还谈什么效率呀,第二个顶多在函数里多了4个字节的引用,第一个只是在for里面每次增加4个字节的引用(在没被GC之前)。要论效率,肯定是第二个要高点点,但是没意义,并且对栈的操作次数是一样的。
syzhwh 2008-08-27
  • 打赏
  • 举报
回复
第一个好,编程少写了temp;这几个字符:)
zhj92lxs 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]
我认为下面这种方式更好,同时限制了迭代器的局部变量作用域。

Java codefor(Iterator<E>i=c.iterator(); i.hasNext(); ) {
E temp=i.next();
}
[/Quote]

支持
dln1234 2008-08-27
  • 打赏
  • 举报
回复
其实差别都不大,看个人喜欢了。萝卜咸菜各有所爱
fengyuleidian3 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 lisl2003 的回复:]
引用 26 楼 hunterzhang0812 的回复:
给你们再做个测试,看看会得到什么结果

List l = new ArrayList();

POJO p;
for (int i=0; i <10; i++) {
p = new POJO;
l.add(p);
}


for (int i=0; i <10; i++) {
POJO p = new POJO;
l.add(p);
}

看看得到的这两个LIST内容有什么区别没有...


汗,这个例子举的……
[/Quote]
呵呵!
mengweilil 2008-08-27
  • 打赏
  • 举报
回复
我不知道pojo是啥。。。。。只好用Integer代替了,打出来是一样的东西
lisl2003 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hunterzhang0812 的回复:]
给你们再做个测试,看看会得到什么结果

List l = new ArrayList();

POJO p;
for (int i=0; i <10; i++) {
p = new POJO;
l.add(p);
}


for (int i=0; i <10; i++) {
POJO p = new POJO;
l.add(p);
}

看看得到的这两个LIST内容有什么区别没有...
[/Quote]

汗,这个例子举的……
cwjieNo1 2008-08-27
  • 打赏
  • 举报
回复
我喜欢后一个·~
mengweilil 2008-08-27
  • 打赏
  • 举报
回复
ls的,pojo是啥东西?
wolfgang_l 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hqbobo 的回复:]
后一个吧
少了一个定义..
[/Quote]
sxn19811006 2008-08-27
  • 打赏
  • 举报
回复
1
ZangXT 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lgg201 的回复:]
不知道这个和基础数据类型复杂数据类型有没有关系?
比如E是一个自定义类型呢?
类型复杂度的提高+海量数据不知道哪个更优,没有环境,提出来大家看看.
[/Quote]
不会差别很大,因为E temp;语句不涉及到创建对象.具体操作都在循环里了
goosman 2008-08-27
  • 打赏
  • 举报
回复
不知道这个和基础数据类型复杂数据类型有没有关系?
比如E是一个自定义类型呢?
类型复杂度的提高+海量数据不知道哪个更优,没有环境,提出来大家看看.
haoxiongok 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bao110908 的回复:]
我认为下面这种方式更好,同时限制了迭代器的局部变量作用域。


Java codefor(Iterator<E> i = c.iterator(); i.hasNext(); ) {
E temp = i.next();
}
[/Quote]
ZangXT 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ZangXT 的回复:]
1的栈操作应该多一些,但不会带来很大的性能损失。
不过2的好处是让temp的作用域限制在循环之内,如果循环后用不到temp了,我会选择2这样的写法。
[/Quote]
晕,正好写反了,丢人了.一般都使用1.
hunterzhang0812 2008-08-27
  • 打赏
  • 举报
回复
给你们再做个测试,看看会得到什么结果

List l = new ArrayList();

POJO p;
for (int i=0; i<10; i++) {
p = new POJO;
l.add(p);
}


for (int i=0; i<10; i++) {
POJO p = new POJO;
l.add(p);
}

看看得到的这两个LIST内容有什么区别没有...
  • 打赏
  • 举报
回复
当然有差别了,写在里面在执行完成后,能加速对象的垃圾回收,
而写在外面由于局部变量作用范围关系,得在完全退出这个方法
时才会被回收掉。

如果代码很短的话基本上是没区别的,但是如何代码比较长,而
且计算比较复杂的话,我认为应该选用 2,毕竟写代码的原则应
该把局部变量的作用范围限制在尽可能小的范围内。
guoxyj 2008-08-27
  • 打赏
  • 举报
回复
差不多
liang8305 2008-08-27
  • 打赏
  • 举报
回复
完全没有必要抠到这么细

不过我喜欢1,因为temp每次都是新的

加载更多回复(12)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧