二话不说先贴出结果,然后解释
然后很明显java8 foreach时间比较长,然后我考虑这个是为什么?
答:
在 Java 8 的方法中,并行流的性能最佳。但是请小心,在某些情况下它也可能会导致程序运行得更慢。
Lambda 表达式的速度介于流与并行流之间。这个结果确实挺令人惊讶的,因为 lambda 表达式的实现方式是基于流的 API 来实现的。
虽然可能效率比较慢,但是为什么java8 会出这个lambda表达式呢?
答:语义更加明显,原本可能需要很多行的代码,现在只需要几行就能搞定,而且大家应该知道lambda表达式是在“策略设计模式”的基础上,变化的,策略模式这里就不细说了,大概就是 生成一个公共接口,然后每一个实现类代表着一种策略。但是写代码还是很累,修改的话改动太大,而lambda就不会,他是把函数式的动作当成参数传递进来。以后需求修改了,也可以灵活变动
经过测试 iterator 效率最好 - java8 效率最差
然后在写代码的时候,一次意外,让其代码运行报错了,先贴出代码,大家可以想象
刚开始没想明白,我打断点查看了一下,
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
Arraylist这个地方报错,首先说一下
modCount 是java.util.AbstractList 的,然后
expectedModCount是Itr的一个变量,实现了Iterator
这个方法就是比较 在迭代中是否进行了参数的修改,如果进行了,这两个就不同,返回ConcurrentModificationException,
然后我进行跟踪,在modCount是10,expectedModCount是9的时候,抛出了异常。
发现list添加的时候 不能再迭代中进行添加,删除,
this.modCount = parent.modCount;//这是modCount进行修改的代码
吃个饭去,回来继续贴代码
package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.Iterator; import java.util.List; /** * 之前都没整理就是用iterator方式 * @ClassName: A * @Description: TODO(这里用一句话描述这个类的作用) * @author xgf * @date 2017年12月13日 上午10:39:33 * */ public class A { public static void main(String[] args) { //根据organizeID 查询组织机构表 上面的父类 算了,不想了,直接递归 List<Organization> OrganizationList =Arrays.asList(new Organization("1","1","1"),new Organization("2","2","2"),new Organization("3","3","3")); List<Organization> list=new ArrayList<>(); long time1 = System.currentTimeMillis(); /** 这地方代码写的还有点low,之后改 -xgf */ OrganizationList.stream().forEach(a -> { if("1".equals(a.getOrganizeGrade())){ list.add(a); }else if("2".equals(a.getOrganizeGrade())){ list.add(a); }else if("3".equals(a.getOrganizeGrade())){ list.add(a); } }); long time2 = System.currentTimeMillis(); System.out.println("java8 foreach用时:"+(time2-time1)); long time3 = System.currentTimeMillis(); Iterator<Organization> iterator = OrganizationList.iterator(); while (iterator.hasNext()) { Organization next = iterator.next(); if("1".equals(next.getOrganizeGrade())){ list.add(next); }else if("2".equals(next.getOrganizeGrade())){ list.add(next); }else if("3".equals(next.getOrganizeGrade())){ list.add(next); } } long time4 = System.currentTimeMillis(); System.out.println("iterator用时:"+(time4-time3)); long time5 = System.currentTimeMillis(); for (int i = 0; i < OrganizationList.size(); i++) { Organization next = OrganizationList.get(i); if("1".equals(next.getOrganizeGrade())){ list.add(next); }else if("2".equals(next.getOrganizeGrade())){ list.add(next); }else if("3".equals(next.getOrganizeGrade())){ list.add(next); } } long time6 = System.currentTimeMillis(); System.out.println("for循坏i 用时:"+(time6-time5)); long time7 = System.currentTimeMillis(); for (Organization next : list) { if("1".equals(next.getOrganizeGrade())){ list.add(next); }else if("2".equals(next.getOrganizeGrade())){ list.add(next); }else if("3".equals(next.getOrganizeGrade())){ list.add(next); } } long time8 = System.currentTimeMillis(); System.out.println("foreach用时:"+(time8-time7)); } }这是出错的代码
问题是我把最后一个foreach的遍历对象 写成了list,在里面还add了,哈哈,所以必须出错
把list 换成 OrganizationList 就好了
没什么难度,只是记录。我昨天买了两本书,看看去