「javafor效率」java提高for循环速度
今天给各位分享javafor效率的知识,其中也会对java提高for循环速度进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java为什么 foreach比for效率高
(1)for是使用下标(偏移量)定位的.
(2)foreach应该是使用类似循环子的机构
(3)对随机访问效率高的ArrayList. 使用下标访问效率本身很高.foreach内部的循环子直接封装下标,自己实现的for比foreach更直接,效率稍高些,但差别不会太大,仍然在一个数量级上。 (4)如果使用插入和删除效率高的LinkedList,for基于下标访问会每次从头查询,效率会很低.foreach循环子使用高效的地址运算,效率会高.其差距将很大,完全不在一个数量级别.如果数组很大,差别可能会几百甚至上千倍.
java中for循环和迭代器哪个效率高?
java中迭代器效率高
ArrayList实现了RandomAccess接口,RandomAccess接口为ArrayList带来了什么好处呢?
我们查看一下RandomAccess的源码文档,发现有这样一段描述:
As a rule of thumb, a List implementation should implement this interface if, for typical instances of the class, this loop:
for (int i=0, n=list.size(); i n; i++)
list.get(i);
runs faster than this loop:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
从描述中,可以看出实现RandomAccess接口的集合类,使用for循环的效率会比Iterator高。
RandomAccess接口为ArrayList带来的好处:
1、可以快速随机访问集合。
2、使用快速随机访问(for循环)效率可以高于Iterator。
java中for循环和迭代器哪个效率高,紧急求答
摘抄至 cxxyjsj 的回答,我个人赞成此观点:
记录的存取方式有两种:一种是顺序存储,另一种是链接存储
对于顺序存储的记录可以根据其下标找到对应的记录,而链接存储(拿单链表为例)
则必须找到其前一个记录的位置才能够找到本记录。
所以for循环便于访问顺序存储的记录,比如数组等
而迭代则更适用于链接存储的记录,虽然Java中有些底层通过链接存储原理实现的集合
也可以通过下标获取指定的记录,但是其每次都必须从链表头开始查找记录,这样会影响查找的效率
Java几种常用的IO写法与效率比较
Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较。虽然网上已经有了类似的文章,但是对他们的结论并不认同。常见的实现方法:1.for循环:for(int i = 0; i list.size(); i++) for(int i = 0, size = list.size(); i size; i++) 一般人都会认为第二种写法效率高。
2.foreach:for(Object obj : list) 这是一种简洁的写法,只能对列表进行读取,无法修改。
3.while:int size = list.size(); while(size-- 0) 4.迭代:
Object iter = list.iterator(); while(iter.hasNext()) { iter.next(); }测试代码: 针对以上几种方法编写的测试代码。 public static void main(String[] args) { List list = new ArrayList(); int runTime = 1000;//执行次数 for (int i = 0; i 1000 * 1000; i++) { list.add(i); } int size = list.size(); long currTime = System.currentTimeMillis();//开始分析前的系统时间 //基本的for for(int j = 0; j runTime; j++) { for (int i = 0; i size; i++) { list.get(i); } } long time1 = System.currentTimeMillis(); //foreach for(int j = 0; j runTime; j++) { for (Integer integer : list) { } } long time2 = System.currentTimeMillis(); for(int j = 0; j runTime; j++) { //while int i = 0 ; while(i size){ list.get(i++); } } long time3 = System.currentTimeMillis(); for(int j = 0; j runTime; j++) {//普通for循环 for (int i = 0; i list.size(); i++) { list.get(i); } } long time4 = System.currentTimeMillis(); for(int j = 0; j runTime; j++) {//迭代 Iterator iter = list.iterator(); while(iter.hasNext()) { iter.next(); } } long time5 = System.currentTimeMillis(); long time = time1 - currTime ; System.out.print("use for:" + time); time = time2 - time1; System.out.print("\tuse foreach:" + time); time = time3 - time2; System.out.print("\tuse while:" + time); time = time4 - time3; System.out.print("\tuse for2:" + time); time = time5 - time4; System.out.print("\tuse iterator:" + time); System.out.println(); }输出结果(JDK1.6):1.use for:8695 use foreach:17091 use while:6867 use for2:7741 use iterator:14144
2.use for:8432 use foreach:18126 use while:6905 use for2:7893 use iterator:139763.use for:8584 use foreach:17177 use while:6875 use for2:7707 use iterator:14345
结论:1.针对列表的 foreach的效率是最低:耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似。2. list.size()的开销很小:list.size()次数多少对效率基本没有影响。查看ArrayList的实现就会发现,size()方法的只是返回了对象内的长度属性,并没有其它计算,所以只存在函数调用的开销。对数组的测试:将代码中的列表list换做数组再进行测试(iterator不适用),发现耗时基本为0。说明:
3. 列表的get()方法开销不少应该主要是检测数据合法性时产生的。将执行次数增加100万倍,这时可以看出结果基本相等,并没有明显的差异。说明:4. 数组length也没有开销可见数组长度并不是每次执行的时候都要计算的。联想一下Java创建数组的时候要求必须指定数组的长度,编译处理的时候显然没有把这个值抛弃掉。网上有一篇类似的文章,它居然得出了一个foreach执行效率最高的结论。
javafor效率的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java提高for循环速度、javafor效率的信息别忘了在本站进行查找喔。