循环方法多,咱该优先选哪个

a1522609810 2011-11-11 06:24:59
我是Java初学者,这个问题一直困扰着我,请教高人指点
比如说我写几个循环

List<Var> vars= new ArrayList<Var>();

for (int i = 0; i < vars.size(); i++) {
Var var = vars.get(i);
//……
}
/*-----------------------------------------------*/

for (Iterator<Var> it = vars.iterator(); it.hasNext();) {//用迭代器会有内部锁定,效率应给不会高
Var var = it.next();
//……
}
/*-----------------------------------------------*/

Iterator<Var> it = vars.iterator();//同上
while(it.hasNext()){
Var var = it.next();
//……
}
/*-----------------------------------------------*/

for (Var temp_var : vars) {//这个是foreach迭代,不知道底层是iterator,不是的话拜托各位高手解释
Var var = temp_var;
//……
}

我举这几个例子,就这些循环中哪个效率会更高呢?
如果有更高效的循环,也请与大家分享,谢谢。

...全文
91 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟祥月 2011-11-12
  • 打赏
  • 举报
回复
五楼的解释很详细 顶一个
补充一句 哪个顺手用哪个
比如你需要下标的时候 就是用普通的循环吧
如果不需要可以考虑更简洁的 避免出错
龙四 2011-11-12
  • 打赏
  • 举报
回复
哪个方便用哪个,不然提供那么多给你做什么!


需要注意的是,不要使用do...while就OK
a1522609810 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shine333 的回复:]
优先使用foreach。理由:
1 访问数组与容器等(Iterable)方式统一
2 速度上,并不慢(下面会特别讲效率)
缺点:
没法直接获取循环下标

补充:
1 lz的第3种方式属于坚决需要消灭的方式,最小化变量使用范围。

Java code


Iterator<Var> it = vars.iterator();//同上
while(it.hasNext()){……
[/Quote]
蛮有深度,呵呵,不过我理解,对于你补充里的第2条意思是不是说foreach底层其实也是用了iterator呢?还有补充里的第三条,这个意思有点难懂,举个例子好么,我理解着好像是说在循环里要避免用数据下标作为变量的方式呢?请解释一下
shine333 2011-11-12
  • 打赏
  • 举报
回复
pps: LinkedList的iterator,与LinkedList本身不同,它里面有保存当前遍历到的Entry的句柄。因此速度快很多。
shine333 2011-11-12
  • 打赏
  • 举报
回复
优先使用foreach。理由:
1 访问数组与容器等(Iterable)方式统一
2 速度上,并不慢(下面会特别讲效率)
缺点:
没法直接获取循环下标

补充:
1 lz的第3种方式属于坚决需要消灭的方式,最小化变量使用范围。

Iterator<Var> it = vars.iterator();//同上
while(it.hasNext()){
Var var = it.next();
//……
}
Iterator<Var> it2 = vars.iterator();//同上
while(it.hasNext()){
Var var = it.next();
//……
}

出BUG了,编译器也帮不了你,但是将it/it2写到for里面,用错马上报警。foreach的话,源代码都没这个变量,错误可能性也变小。

2 lz关于for each与Iterator的疑问。foreach只是在代码中,编译出来的代码,其实还是lz第二种,用iterator

3 效率上,刚好和lz理解的相反,iterator只快不慢。
至少从java.util,来讲。做了synchronized的,其容器的get/size方法本身也synchronized处理了,没做synchronized,虽然有同步编辑检查(避免遍历的同时,容器被修改),但是容器的get方法本身也做了复杂度相同的越界检查,所以从速度上来看没什么区别。

但是,java.lang.LinkedList等几个,如果存放的数据量极大,绝对不能用get/size的方法来循环。盖因LinkedList任何情况下只保留第一个节点header
LinkedListget(1),其实相当于调用了list.header.next,get(5)相当于list.header.next.next.next.next.next,假设list.size = 100万,那么get(499999)需要循环next,50000次。get(500000)需要循环previous也是500000次(后面一半的get,使用header.previous.previous...)
wanglixin200 2011-11-11
  • 打赏
  • 举报
回复
其实 for 、while、do while 的效率都差不多的,就像上面几位说的,哪个顺手用哪个。不过do while循环用的少一些,个人觉得主要是写起来繁琐一些。
java当中还增加了一个循环方式 foreach。这个循环方式是 5.0 后加入的,虽然现在JDK已经到了7.0 不过保不齐还有公司用 5.0 之前的JDK。所以这个循环要注意一下,别的就没什么了。
zzu_sun 2011-11-11
  • 打赏
  • 举报
回复
foreach高些吧,有时候看具体情况,其实循环只要不嵌套效率都差不多,循环体不要超过三层
孤单旅行 2011-11-11
  • 打赏
  • 举报
回复
确实看实际需要,或者考虑到用起来哪个方便。反正使用数组是最快的
ylovep 2011-11-11
  • 打赏
  • 举报
回复
根据实际需要以及jdk的版本 至于细微的区别 没研究过

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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