比较for循环、迭代器、java8Stream流遍历的不同

 package cnom.test.testUtils;

 import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Random; public class TestCollectionsSort { public static void main(String[] args) throws InterruptedException {
TestCollectionsSort test = new TestCollectionsSort(); List<TestSortModel> list = new ArrayList<TestSortModel>();
TestSortModel model = null;
for (int i = 0; i < 80000; i++) {
model = test.new TestSortModel();
int intId = (int) (Math.random() * 100);
model.setIntId(intId);
model.setName("tes" + i);
list.add(model);
}
// JAVA8 使用Comparator排序
// list.sort(Comparator.comparing(TestSortModel::getIntId,
// Comparator.nullsLast(Comparator.naturalOrder()))); List<String> resList = new ArrayList<String>(); long t1 = System.currentTimeMillis();
for (TestSortModel tsm : list) {
int id = tsm.getIntId();
// Thread.sleep(1);
resList.add(tsm.getName());
}
System.out.println("增强for循环 遍历耗时:" + (System.currentTimeMillis() - t1) + ";list.size()="
+ list.size() + ";list=" + resList.toString());
resList.clear(); long t2 = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
int id = list.get(i).getIntId();
// Thread.sleep(1);
resList.add(list.get(i).getName());
}
System.out.println("for循环 遍历耗时:" + (System.currentTimeMillis() - t2) + ";list.size()="
+ list.size() + ";list=" + resList.toString());
resList.clear(); long t3 = System.currentTimeMillis();
Iterator<TestSortModel> it = list.iterator();
TestSortModel tm = null;
while (it.hasNext()) {
tm = it.next();
int id = tm.getIntId();
// Thread.sleep(1);
resList.add(tm.getName());
}
System.out.println("iterator 遍历耗时:" + (System.currentTimeMillis() - t3) + ";list.size()="
+ list.size() + ";list=" + resList.toString());
resList.clear(); //parallerlStream遍历,适用于处理比较耗时的业务逻辑。
//注意:若在遍历中将元素添加到另一个list,则这个list必须是线程安全的,否则遍历过程中会出现两种情况:
//1.这个list中的元素会有丢失的情况; 2.遍历中会抛出:ArrayIndexOutOfBoundsException
List<TestSortModel> listt = Collections.synchronizedList(new ArrayList<TestSortModel>());
long t4 = System.currentTimeMillis();
list.parallelStream().forEach(tsm -> {//若是 forEachOrdered会保持原来list顺序
int id = tsm.getIntId();
// listt.add(tsm);//输出的listt会有元素丢失,线程安全的list则不会
try {
// Thread.sleep(1);
resList.add(tsm.getName());//输出的resList也会有元素丢失
} catch (Exception e) {
e.printStackTrace();
}
});
System.out
.println("list.parallelStream().forEach() 遍历耗时:" + (System.currentTimeMillis() - t4)
+ ";list.size()=" + resList.size() + ";list=" + resList.toString());
resList.clear(); long t5 = System.currentTimeMillis();
list.stream().forEach(tsm -> {//串行执行,与for循环效率相似,代码精简
int id = tsm.getIntId();
try {
// Thread.sleep(1);
resList.add(tsm.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
System.out.println("list.stream().forEach() 遍历耗时:" + (System.currentTimeMillis() - t5)
+ ";list.size()=" + list.size() + ";list=" + resList.toString());
resList.clear(); long t6 = System.currentTimeMillis();
list.forEach(tsm -> {//精简代码,与for循环效率相似
int id = tsm.getIntId();
try {
// Thread.sleep(1);
resList.add(tsm.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
System.out.println("list.forEach() 遍历耗时:" + (System.currentTimeMillis() - t6)
+ ";list.size()=" + list.size() + ";list=" + resList.toString());
resList.clear(); /**
* for loop1 增强for循环 遍历耗时:80051
* for loop2 for循环 遍历耗时:80032
* iterator 遍历耗时:80069
* list.parallelStream().forEach() 遍历耗时:20101 多线程环境下,执行耗时的业务逻辑时使用效率更好。
* list.stream().forEach() 遍历耗时:80049 精简代码
* list.forEach() 遍历耗时:80031
*/ } public class TestSortModel implements Serializable { private static final long serialVersionUID = -890909910704287938L; private long longId; private int intId; private String name; public long getLongId() {
return longId;
} public void setLongId(long longId) {
this.longId = longId;
} public int getIntId() {
return intId;
} public void setIntId(int intId) {
this.intId = intId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
}

java8中的stream流遍历的更多相关文章

  1. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  2. Java8中的Stream流式操作 - 入门篇

    作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...

  3. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

  4. java中的Stream流

    java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

  7. java8 新特性Stream流的应用

    作为一个合格的程序员,如何让代码更简洁明了,提升编码速度尼. 今天跟着我一起来学习下java 8  stream 流的应用吧. 废话不多说,直入正题. 考虑以下业务场景,有四个人员信息,我们需要根据性 ...

  8. Java8中的Stream API

    本篇文章继续介绍Java 8的另一个新特性——Stream API.新增的Stream API与InputStream和OutputStream是完全不同的概念,Stream API是对Java中集合 ...

  9. Java8新特性 Stream流式思想(一)

    遍历及过滤集合中的元素使用传统方式遍历及过滤集合中的元素package cn.com.zq.demo01.Stream.test01.Stream; import java.util.ArrayLis ...

随机推荐

  1. Chrome接口请求一直是pending状态,但接口实际上是正常的

    1.现象 个别机器突然出现Chrome访问我司产品异常,本该通过接口获取的数据没有呈现,之前都是好好的,而且其他机器同样用同版本Chrome访问正常. 出现问题的机器重装Chrome问题依然存在,直到 ...

  2. SQL server无法绑定由多个部分绑定的标示符

    原因https://blog.csdn.net/wolfalcon/article/details/54578215给了我启发,原来有犯错在insert和update的使用上了对于已存在的表(表中有字 ...

  3. ubuntu14.04 编译hadoop-2.6.0-cdh5.4.4

    1 protocol buffer sudo apt-get install libprotobuf-dev asn@hadoop1:~/Desktop$ protoc --version libpr ...

  4. 原生js用div实现简单的轮播图

    文章地址 https://www.cnblogs.com/sandraryan/ 原生js实现轮播图. 打开页面图片自动轮播,点击prev next按钮切换到上/下一张图片,点击1-5切换到对应图片. ...

  5. HDU 5463

    题意:一个盒子有36个格子.每个格子可以装64个物品,搬运一个箱子是一次搬运,问最少到搬运次数 思路:直接求总需要多少个格子,然后去求盒子,这里求盒子呢有个小技巧,就是用ceil函数 #include ...

  6. 困扰的问题终于解决了-docker时区不正确的问题修改记

    前一阵子有一台服务器,mysql的时间比北京时间晚了8个小时.我知道是时区的问题,但是不知道为什么弄成这样,宿主机没有问题,后来一看mysql的docker,时区是错的. mybatis-plus打印 ...

  7. webpack学习(一)项目中安装webpack

    如何在项目中安装webpack,webpack-cli? 前提:电脑安装了 node和npm包管理工具 1 创建项目文件夹或者在已有的项目中打开终端  输入相关命令: npm init 因为已经安装好 ...

  8. .NET C#与Java比较——Servlet

    目录 1. Servlet 和 Ashx(一般处理程序) 2. Servlet 和 JSP 3. Servlet的生命周期 4. Java Filter 和 HttpModule,ActionFilt ...

  9. vue v-for循环中key属性的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. web.xml和@WebServlet

    web.xml <servlet> <servlet-name>DZDYServlet</servlet-name> <servlet-class>包名 ...