foreach与Iterator的一些事
来源:互联网 发布:淘宝首页设计 编辑:程序博客网 时间:2024/06/05 20:01
1:foreach与Iterator
最近在阅读Java编程思想第11章看到了Foreach与迭代器,文中说到“foreach语法主要用于数组,但是它也可以应用于任何Collection对象,任何实现了Iterator接口的类,都可以将它用于foreach语句中”,其实Iterator就是告诉foreach如何在序列中移动元素,到底是每次向前移动一个元素还是向后移动一个元素具体看你如何实现的Iterator接口了,下面就是Iterator接口的方法,总共也就是三个,hasNext() next() 和 remove(),刚才说到的具体如何在序列中移动元素对应到就是如何实现的next()方法.
public interface Iterator<E> { boolean hasNext(); E next(); void remove();}
2:foreach的本质
隐约记得foreach实则还是调用的Iterator,本着学习的目的想去查看下foreach的源码却发现并没有,也看了不少类似的文章确实通过反编译可以进行证实,这里附上反编译前后的方法对比
反编译前
public static void testForEach(List persons) { Object curPerson; for(Object person : persons){ curPerson = person; } }
反编译后
public static void testForEach(List persons) { for (Iterator iterator = persons.iterator(); iterator.hasNext();) { Object person = iterator.next(); Object obj = person; } }
从反编译后的结果可以明显看出foreach实则还是通过迭代器实现的,其实在编译期就进行这步替换,即将foreach替换为Iterator。
3:效率
自己也是亲自对两种遍历方式的效率进行了测试,主要还是使用了常用的ArrayList进行的测试。
测试的结果如下
从测试的结果来看foreach的遍历性能略低于Iterator
附:测试的源代码,其中的Person为一简单的实体类,仅包含String name和int age两个属性
/* * System.nanoTime()获取的时间单位为纳秒 */ List<Person> persons = new ArrayList<Person>(); for(int i=0;i<1000000;i++){ persons.add(new Person("Muyi"+i,i)); } System.out.println(persons.size()); Person curPerson = null; long beginTime = System.nanoTime(); for(Person person:persons){ curPerson = person; } long currentTime = System.nanoTime(); System.out.println("Foreach UseTime:"+(currentTime-beginTime)/1000); Iterator<Person> iterator = persons.iterator(); beginTime = System.nanoTime(); while(iterator.hasNext()){ curPerson = iterator.next(); } currentTime = System.nanoTime(); System.out.println("Iterator UseTime:"+(currentTime-beginTime)/1000);
阅读全文
0 0
- foreach与Iterator的一些事
- forEach无法remove与Iterator的关系
- Iterator与foreach遍历
- iterator 遍历与for循环与foreach的优劣对比
- iterator & foreach
- s:iterator与c:forEach 数字循环
- Foreach与Iterator遍历集合注意
- java学习笔记-foreach与iterator
- 集合遍历之Iterator与foreach
- for,foreach,iterator的用法和区别
- ADF: Foreach和Iterator的区别
- for,foreach,iterator的用法和区别
- for,foreach,iterator的用法和区别
- for,foreach,iterator的用法和区别
- Iterator,for,forEach的遍历和效率
- java和javascript的for,foreach,iterator
- 集合的遍历:Iterator接口、foreach
- for 、foreach和iterator的区别
- [译] AngularJS内幕详解之 Scope JAVASCRIPT Atwood.cai 2015-12-04 15617 访问 4 分享 微信分享 原文作者: Nicolas Beva
- HashMap 在JDK1.8中的实现(与JDK1.7对比)
- Netty开发的例子
- 大数据学习27:Hive元数据清理,从mysql层面删除hive元数据
- Jzoj4846 行走
- foreach与Iterator的一些事
- CSS overflow 溢出
- Vim命令合集
- 关于Log
- hibernate:二
- 读“腾讯传”伤感
- 简单的C语言3
- Uva10162+Uva10539
- 导出离散傅里叶变换(DFT)的两种方法