Java8 ArrayList之forEach的使用

这篇文章主要介绍了Java8 ArrayList之forEach的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java8 ArrayList之forEach使用

之前使用Java8、顺便整理自己学到的一些

一、用法

常用写法

 for (String str : list){ System.out.println(str); }

Java8中

 list.forEach(str-> System.out.println(str)); list.forEach(str-> {});//{}中可以写逻辑 

代码看上去更简洁

二、效率

 public static void main(String[] args) { List list = new ArrayList<>(); for (int i=0;i<1000000;i++){ list.add("str"+i); } for1(list); for2(list); for3(list); for4(list); } public static void for1(List list){ long startTime = System.currentTimeMillis(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i  list){ long startTime = System.currentTimeMillis(); StringBuilder stringBuilder = new StringBuilder(); for (String str : list){ stringBuilder.append(str); } long endTime = System.currentTimeMillis(); System.out.println("for2 execute time : "+(endTime-startTime) +" ms"); } public static void for3(List list){ long startTime = System.currentTimeMillis(); StringBuilder stringBuilder = new StringBuilder(); list.forEach(c -> { stringBuilder.append(c); }); long endTime = System.currentTimeMillis(); System.out.println("for3 execute time : "+(endTime-startTime) +" ms"); } public static void for4(List list){ long startTime = System.currentTimeMillis(); StringBuilder stringBuilder = new StringBuilder(); list.stream().forEach(c -> { stringBuilder.append(c); }); long endTime = System.currentTimeMillis(); System.out.println("for4 execute time : "+(endTime-startTime) +" ms"); }

执行结果:

for1 execute time : 33 ms
for2 execute time : 52 ms
for3 execute time : 78 ms
for4 execute time : 37 ms

结果分析:

虽然forEach使代码看上去更简洁,但是从效率上看却是相反的,最原始的循环效率最高,操作越方便的反而性能会下降,操作越方便的方法其内部都是层层调用

 default void forEach(Consumer action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }

至于list.stream().forEach听说它可以支持多线程并行操作。

ArrayList在foreach中remove的问题分析

都说ArrayList在用foreach循环的时候,不能add元素,也不能remove元素,可能会抛异常,那我们就来分析一下它具体的实现。我目前的环境是Java8。

有下面一段代码:

 public class TestForEachList extends BaseTests { @Test public void testForeach() { List list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); for (String s : list) { } } } 

代码很简单,一个ArrayList添加3个元素,foreach循环一下,啥都不干。那么foreach到底是怎么实现的呢,暴力的方法看一下,编译改类,用 javap -c TestForEachList查看class文件的字节码,如下:

 javap -c TestForEachList Warning: Binary file TestForEachList contains collection.list.TestForEachList Compiled from "TestForEachList.java" public class collection.list.TestForEachList extends com.ferret.BaseTests { public collection.list.TestForEachList(); Code: 0: aload_0 1: invokespecial #1                  // Method com/ferret/BaseTests."":()V 4: return public void testForeach(); Code: 0: new           #2                  // class java/util/ArrayList 3: dup 4: invokespecial #3                  // Method java/util/ArrayList."":()V 7: astore_1 8: aload_1 9: ldc           #4                  // String 1 11: invokeinterface #5,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z 16: pop 17: aload_1 18: ldc           #6                  // String 2 20: invokeinterface #5,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z 25: pop 26: aload_1 27: ldc           #7                  // String 3 29: invokeinterface #5,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z 34: pop 35: aload_1 36: invokeinterface #8,  1            // InterfaceMethod java/util

以上就是Java8 ArrayList之forEach的使用的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java