list 遍历方式(包括java8 Lambda)的比较和简单分析

时间:2021-02-19 19:03:07

二话不说先贴出结果,然后解释

list 遍历方式(包括java8 Lambda)的比较和简单分析

然后很明显java8 foreach时间比较长,然后我考虑这个是为什么?

答:

int java. util. AbstractList.modCount

在 Java 8 的方法中,并行流的性能最佳。但是请小心,在某些情况下它也可能会导致程序运行得更慢。

Lambda 表达式的速度介于流与并行流之间。这个结果确实挺令人惊讶的,因为 lambda 表达式的实现方式是基于流的 API 来实现的。

虽然可能效率比较慢,但是为什么java8 会出这个lambda表达式呢?

答:语义更加明显,原本可能需要很多行的代码,现在只需要几行就能搞定,而且大家应该知道lambda表达式是在“策略设计模式”的基础上,变化的,策略模式这里就不细说了,大概就是 生成一个公共接口,然后每一个实现类代表着一种策略。但是写代码还是很累,修改的话改动太大,而lambda就不会,他是把函数式的动作当成参数传递进来。以后需求修改了,也可以灵活变动

经过测试 iterator 效率最好  -   java8 效率最差

然后在写代码的时候,一次意外,让其代码运行报错了,先贴出代码,大家可以想象

list 遍历方式(包括java8 Lambda)的比较和简单分析

刚开始没想明白,我打断点查看了一下,

 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 就好了

没什么难度,只是记录。我昨天买了两本书,看看去