全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

深入了解java8的foreach循环

虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8,推荐一本书还是不错的<写给大忙人看的javase8>。因为学习了Java8,所以只要能用到的地方都会去用,尤其是Java8的Stream,感觉用起来觉得很方便,因为点点点就出来了,而且代码那么简洁。现在开始慢慢深入了解java8,发现很多东西不能看表面。

  比如常规遍历一个集合,下面给出例子:

1.首先遍历一个List

方式1.一开始是这样的:

public static void test1(List<String> list) {
 for (int i = 0; i < list.size(); i++) {
  System.out.println(list.get(i));
 }
}

方式2.当然稍微高级一点的是这样:

public static void test2(List<String> list) {
 for (int i = 0,lengh=list.size(); i < lengh; i++) {
  System.out.println(list.get(i));
 }
}

方式3.还有就是Iterator遍历:

public static void test3(List<String> list) {
 Iterator<String> iterator = list.iterator();
 while(iterator.hasNext()){
  System.out.println(iterator.next());
 }
}

方式4.后来有了增强for循环:

public static void test4(List<String> list) {
 for(String str:list){
  System.out.println(str);
 }
}

方式5.java8以后新增的方式:

public static void test5(List<String> list) {
 //list.forEach(System.out::println);和下面的写法等价
 list.forEach(str->{
  System.out.println(str);
 });
}

方式6.还有另一种:

public static void test6(List<String> list) {
 list.iterator().forEachRemaining(str->{
  System.out.println(str);
 });
}

  应该没有其他的了吧,上面六中方法,按我的使用习惯5最常用,4偶尔使用,其他的基本就不怎么用了,使用5的原因是因为方便书写,提示就可以写出来,偶尔使用4的原因是,5不方便计数用,下面进行性能测试,String不具备代表性,决定使用对象,简单的一个测试类如下:

  一个简单的测试,内容不要太在意,简单计算hashCode:

package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test8 {
 public static void main(String[] args) {
  List<Dog> list=new ArrayList<>();
  for(int i=0;i<10;i++){
   list.add(new Dog(i,"dog"+i));
  }
  long nanoTime = System.nanoTime();
  test1(list);
  long nanoTime1 = System.nanoTime();
  test2(list);
  long nanoTime2 = System.nanoTime();
  test3(list);
  long nanoTime3 = System.nanoTime();
  test4(list);
  long nanoTime4 = System.nanoTime();
  test5(list);
  long nanoTime5 = System.nanoTime();
  test6(list);
  long nanoTime6 = System.nanoTime();
  System.out.println((nanoTime1-nanoTime)/1000000.0);
  System.out.println((nanoTime2-nanoTime1)/1000000.0);
  System.out.println((nanoTime3-nanoTime2)/1000000.0);
  System.out.println((nanoTime4-nanoTime3)/1000000.0);
  System.out.println((nanoTime5-nanoTime4)/1000000.0);
  System.out.println((nanoTime6-nanoTime5)/1000000.0);
 }
public static void test1(List<Dog> list) {
 for (int i = 0; i < list.size(); i++) {
  list.get(i).hashCode();
 }
}
public static void test2(List<Dog> list) {
 for (int i = 0,lengh=list.size(); i < lengh; i++) {
  list.get(i).hashCode();
 }
}
public static void test3(List<Dog> list) {
 Iterator<Dog> iterator = list.iterator();
 while(iterator.hasNext()){
  iterator.next().hashCode();
 }
}
public static void test4(List<Dog> list) {
 for(Dog dog:list){
  dog.hashCode();
 }
}
public static void test5(List<Dog> list) {
 //list.forEach(System.out::println);和下面的写法等价
 list.forEach(dog->{
  dog.hashCode();
 });
}
public static void test6(List<Dog> list) {
 list.iterator().forEachRemaining(dog->{
  dog.hashCode();
 });
}
}
class Dog{
 private int age;
 private String name;
 public Dog(int age, String name) {
  super();
  this.age = age;
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 @Override
 public String toString() {
  return "Dog [age=" + age + ", name=" + name + "]";
 }
}

  运行三次取平均值,机器配置就不说了,因为我不是比较的绝对值,我是比较的这几种方式的相对值,数据结果,趋势图如下:

  然后去掉表现一直很稳定的方式5和百万级数据量以上的数据,来分析结果:

  可以得出一个非常吓人的结果,java8的foreach每次循环的耗时竟然高达100毫秒以上,虽然它比较稳定(算是优点吧)。所以得出以下结论:

  在正常使用(数据量少于百万以下),正常(非并行)遍历一个集合的时候:

•不要使用java8的foreach,每次耗时高达100毫秒以上

•提前计算出大小的普通for循环,耗时最小,但是书写麻烦

•增强for循环表现良好

2.再次遍历一个Set

  使用以相同的方式测试HashSet,测试方法如下:

package test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test9 {
 public static void main(String[] args) {
  Set<Dog> set = new HashSet<>();
  for (int i = 0; i < 10_000_000; i++) {
   set.add(new Dog(i, "dog" + i));
  }
  long nanoTime = System.nanoTime();
  test1(set);
  long nanoTime1 = System.nanoTime();
  test2(set);
  long nanoTime2 = System.nanoTime();
  test3(set);
  long nanoTime3 = System.nanoTime();
  test4(set);
  long nanoTime4 = System.nanoTime();
  System.out.println((nanoTime1 - nanoTime) / 1000000.0);
  System.out.println((nanoTime2 - nanoTime1) / 1000000.0);
  System.out.println((nanoTime3 - nanoTime2) / 1000000.0);
  System.out.println((nanoTime4 - nanoTime3) / 1000000.0);
 }
 public static void test1(Set<Dog> list) {
  Iterator<Dog> iterator = list.iterator();
  while (iterator.hasNext()) {
   iterator.next().hashCode();
  }
 }
 public static void test2(Set<Dog> list) {
  for (Dog dog : list) {
   dog.hashCode();
  }
 }
 public static void test3(Set<Dog> list) {
  list.forEach(dog -> {
   dog.hashCode();
  });
 }
 public static void test4(Set<Dog> list) {
  list.iterator().forEachRemaining(dog -> {
   dog.hashCode();
  });
 }
}

  经过计算得出如下结果:

  不难发现,java8的foreach依然每次耗时100ms以上,最快的变成了增强for循环,Iterator遍历和java8的iterator().forEachRemaining差不多。

3.最后遍历Map

  依然使用相同的方式测试Map集合遍历,测试类如下:

package test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test10 {
 public static void main(String[] args) {
  Map<String, Dog> map = new HashMap<>();
  for (int i = 0; i < 1000_000; i++) {
   map.put("dog" + i, new Dog(i, "dog" + i));
  }
  long nanoTime = System.nanoTime();
  test1(map);
  long nanoTime1 = System.nanoTime();
  test2(map);
  long nanoTime2 = System.nanoTime();
  test3(map);
  long nanoTime3 = System.nanoTime();
  test4(map);
  long nanoTime4 = System.nanoTime();
  System.out.println((nanoTime1 - nanoTime) / 1000000.0);
  System.out.println((nanoTime2 - nanoTime1) / 1000000.0);
  System.out.println((nanoTime3 - nanoTime2) / 1000000.0);
  System.out.println((nanoTime4 - nanoTime3) / 1000000.0);
 }
 public static void test1(Map<String, Dog> map) {
  Iterator<Map.Entry<String, Dog>> entries = map.entrySet().iterator();
  while (entries.hasNext()) {
   Map.Entry<String, Dog> entry = entries.next();
   int code=entry.getKey().hashCode()+entry.getValue().hashCode();
  }
 }
 public static void test2(Map<String, Dog> map) {
  for (Map.Entry<String, Dog> entry : map.entrySet()) {
   int code=entry.getKey().hashCode()+entry.getValue().hashCode();
  }
 }
 public static void test3(Map<String, Dog> map) {
  for (String key : map.keySet()) {
   int code=key.hashCode()+map.get(key).hashCode();
  }
 }
 public static void test4(Map<String, Dog> map) {
  map.forEach((key, value) -> {
   int code=key.hashCode()+value.hashCode();
  });
 }
}

  结果如下:

  java8的foreach依然不负众望,最快的是增强for循环。

最终结论

    普通(数量级10W以下,非并行)遍历一个集合(List、Set、Map)如果在意效率,不要使用java8的foreach,虽然它很方便很优雅

    任何时候使用增强for循环是你不二的选择

以上所述是小编给大家介绍的java8的foreach循环 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


# java  # foreach循环  # Java for循环的几种用法分析  # Java中的两种for循环介绍  # java使用for循环输出杨辉三角  # 深入理解java中for和foreach循环  # 浅析java的foreach循环  # java跳出for循环的三种常见方法  # Java双重for循环的优化示例  # 遍历  # 的是  # 就不  # 其他的  # 小编  # 我是  # 是因为  # 尤其是  # 是这样  # 说了  # 不多  # 不负众望  # 你不  # 用了  # 给大家  # 几种  # 正常使用  # 能看  # 人看  # 一本书 


相关文章: 高端云建站费用究竟需要多少预算?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  寿县云建站:智能SEO优化与多行业模板快速上线指南  简历在线制作网站免费版,如何创建个人简历?  如何规划企业建站流程的关键步骤?  Swift开发中switch语句值绑定模式  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  seo网站制作优化,网站SEO优化步骤有哪些?  如何快速搭建二级域名独立网站?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何获取上海专业网站定制建站电话?  ppt制作免费网站有哪些,ppt模板免费下载网站?  制作网站公司那家好,网络公司是做什么的?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何基于云服务器快速搭建网站及云盘系统?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  网站制作报价单模板图片,小松挖机官方网站报价?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何快速启动建站代理加盟业务?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  建站主机类型有哪些?如何正确选型  建站主机服务器选购指南:轻量应用与VPS配置解析  定制建站方案优化指南:企业官网开发与建站费用解析  如何访问已购建站主机并解决登录问题?  测试制作网站有哪些,测试性取向的权威测试或者网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何通过西部数码建站助手快速创建专业网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何在自有机房高效搭建专业网站?  如何高效完成自助建站业务培训?  建站之星后台管理:高效配置与模板优化提升用户体验  如何在西部数码注册域名并快速搭建网站?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  孙琪峥织梦建站教程如何优化数据库安全?  南京网站制作费用,南京远驱官方网站?  宝塔新建站点为何无法访问?如何排查?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  定制建站是什么?如何实现个性化需求?  如何通过VPS搭建网站快速盈利?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何通过虚拟机搭建网站?详细步骤解析  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  ,南京靠谱的征婚网站?  非常酷的网站设计制作软件,酷培ai教育官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。