前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iterator 遍历与for循环与foreach的优劣对比

iterator 遍历与for循环与foreach的优劣对比

作者头像
粲然忧生
发布2023-10-12 09:22:56
1950
发布2023-10-12 09:22:56
举报
文章被收录于专栏:工程师的分享工程师的分享

最近看到项目上有这样的语句

 Iterator it = list.iterator();     while (it.hasNext()) {         objects = (Object[]) iter.next();     }

瞬间感觉比起自己的for循环语句高端大气了不少,但此刻又有疑问,到底这两种那种比较好

先拿出for循环来对比

for(int i=0;i <list.size();i++){  objects = (Object[])list.get(i);  } 

经过查询,查到了很多,现在来分享一下

一方面从简洁程度和可复用的角度,迭代器的方法必然比较轻松 ,比如当前list的组织结构变化,不能用get()函数获取,则需要重新更改for循环代码,而迭代器不用,故这是开发爱好者比较喜欢的一种代码方式

至于效率方面,找到了一位大神的测试分析http://bbs.csdn.net/topics/250025827

现在拷贝一些关键数据

代码语言:javascript
复制
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

/**
 * IteratorTest
 * @author SageZk
 */
public class IteratorTest {

	public static long testForloops(List<String> list) {
		long start = 0L, end = 0L;
		@SuppressWarnings("unused")
		String le = null;
		start = System.nanoTime();
		for (int i = list.size() - 1; i >= 0; --i) {
			le = list.get(i);
		}
		end = System.nanoTime();
		return end - start;
	}

	public static long testIterator(List<String> list) {
		long start = 0L, end = 0L;
		@SuppressWarnings("unused")
		String le = null;
		start = System.nanoTime();
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			le = it.next();
		}
		end = System.nanoTime();
		return end - start;
	}

	public static void main(String[] args) {
		//测试列表长度
		final int LEN = 10000;

		//初始化测试用数据
		List<String> arraylist = new ArrayList<String>();
		List<String> linkedlist = new LinkedList<String>();
		for (int i = 0; i < LEN; ++i) {
			String s = Integer.toString(i, 2);
			arraylist.add(s);
			linkedlist.add(s);
		}

		//打印测试结果
		final String FORMAT = "%1$-16s%2$-16s%3$16d\n";
		System.out.println("List\t\tType\t\tTime(nanoseconds)");
		System.out.println("-------------------------------------------------");
		System.out.printf(FORMAT, "ArrayList", "for", testForloops(arraylist));
		System.out.printf(FORMAT, "ArrayList", "Iterator", testIterator(arraylist));
		System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
		System.out.printf(FORMAT, "LinkedList", "Iterator", testIterator(linkedlist));
	}

}

以下是 3 组测试结果: [code=BatchFile]List Type Time(nanoseconds) ------------------------------------------------- ArrayList       for                      1189258 ArrayList       Iterator                 2365594 LinkedList      for                    152396254 LinkedList      Iterator                 2340801 List Type Time(nanoseconds) ------------------------------------------------- ArrayList       for                      1235701 ArrayList       Iterator                 4249982 LinkedList      for                    149825606 LinkedList      Iterator                 2525531 List Type Time(nanoseconds) ------------------------------------------------- ArrayList       for                      1198267 ArrayList       Iterator                 2584617 LinkedList      for                    150382451 LinkedList      Iterator                 2347994 [/code]

这里可以看出当用linkedlist的方式时用iterator明显好很多

这时又有人提出,可以用foreach来编写,这样更加简略

List <String> list = new ArrayList <String>();  for (String s:list) {      System.out.println(s);  } 

这时,本着比对的态度,网上进行了查阅,首先从java forEach实现原理可以参见下文http://blog.csdn.net/a596620989/article/details/6930479

我们可以看到foreach其实就是迭代器,而且多加了一个一个检查

但foreach又有什么坏处呢

通过http://lavasoft.blog.51cto.com/62575/53321/

我们可以看到结论:

foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了。在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的时候了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档