「javafor效率」java提高for循环速度

博主:adminadmin 2023-01-22 09:42:08 236

今天给各位分享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效率的信息别忘了在本站进行查找喔。