Java 数组和集合list [array,arrayList,linkedList]的效率, 几种for循环[for,for each, lambda] 使用JProfiler进行效率测试

匿名 (未验证) 提交于 2019-12-02 21:40:30
版权声明:觉得此文有用的,不嫌麻烦的,就留个言呐,或者点个赞呐(额,就是文章底部的“顶”啦),要是嫌弃麻烦呢,也麻烦点个赞嘛,要是实在不想点赞呢,也不是不可以。 但是,你要是想踩一脚呢,那还是赶紧,马上,快快的闪人。 小心我手里三十米长的大刀。 哼哼。想想都怕 !!! https://blog.csdn.net/qq_27093465/article/details/91890824

在做效率测试的时候,会发现,在代码里面不起眼的一个for循环,会损失掉不少时间。几种for循环要使用哪个,会效率高点,常用的集合一般都是arrayList,他的循环遍历的效率如何,是不是首选的呢?

开局一张图

然后看这个图的运行代码

 package com.lxk.commonTest;  import com.lxk.util.CollectionUtil;  import java.util.List;  /**  * 关于for循环的测试  *  * @author lxk on 2017/4/21  */ public class ForTest {     private static final int SIZE = 40000;      public static void main(String[] args) {         testForEfficiency();     }      /**      * 测试不同for的效率问题      */     private static void testForEfficiency() {         String[] array = CollectionUtil.getArray(SIZE);         List<String> arrayList = CollectionUtil.getArrayList(SIZE);         List<String> linkedList = CollectionUtil.getLinkedList(SIZE);         while (true) {             testArray(array);             testArrayList(arrayList);             //testLinkedList(linkedList);         }     }      /**      * array 在使用forI循环的效率测试      */     private static void testArray(String[] array) {         testForI(array);         testForeach(array);     }      /**      * arrayList 在使用forI循环,forEach循环和lambda循环的效率测试      */     private static void testArrayList(List<String> arrayList) {         testForI(arrayList);         testForEach(arrayList);         testLambda(arrayList);     }      /**      * linkedList 在使用forI循环,forEach循环和lambda循环的效率测试      */     private static void testLinkedList(List<String> linkedList) {         testForI(linkedList);         testForEach(linkedList);         testLambda(linkedList);     }      private static void testForI(String[] array) {         StringBuilder sb = new StringBuilder();         for (int i = 0; i < SIZE; i++) {             sb.append(array[i]);         }     }     private static void testForeach(String[] array) {         StringBuilder sb = new StringBuilder();         for (String s : array) {             sb.append(s);         }     }      private static void testForI(List<String> arrayList) {         StringBuilder sb = new StringBuilder();         for (int i = 0; i < SIZE; i++) {             sb.append(arrayList.get(i));         }     }      private static void testForEach(List<String> arrayList) {         StringBuilder sb = new StringBuilder();         for (String s : arrayList) {             sb.append(s);         }     }      private static void testLambda(List<String> arrayList) {         StringBuilder sb = new StringBuilder();         arrayList.forEach(sb::append);     } } 

先,暂时注释掉linkedList集合的测试代码。

分析一下:

1,数组和集合谁的遍历效率高?

看上面的图,同样的数据,使用ArrayList存储,再遍历最快的占比21.6%,使用数组存储,然后来遍历,时间占比是12.1%。明显是数组循环的时间占比少,所以,数组的遍历效率是比较好的。

2,for i,for each,lambda 三种循环方式,谁好呢?

对于数组来说:我测试的地方数组使用来for i 循环和for each 循环,lambda没得。发现两者是一样的。

同样的数据使用ArrayList去存储,使用三种遍历方式,发现,for each是比较慢的,for i 和lambda的循环效率是差不多的。for i 稍微占点点优势。

然后,打开,linkedList的注释,再来一次。

开局还是一张图

分析一下:

对于linkedList来说,底层是链表结构,for i 循环,是最差的循环方式,

剩下的结论和上面的差不多了

还是数组存储数据,遍历最快,然后就是for i 循环比lambda好一点点,最后是for each循环。

另:使用的另一个造数据的类

 package com.lxk.util;  import com.google.common.collect.Lists; import com.google.common.collect.Maps;  import java.util.List; import java.util.Map;  /**  * 自定义集合类  *  * @author lxk on 2017/11/13  */ public class CollectionUtil {     private static final int SIZE = 5;      /**      * 获得底层是数组的list集合      */     public static List<String> getArrayList(Integer size) {         size = (size == null || size <= 0) ? SIZE : size;         List<String> list = Lists.newArrayListWithExpectedSize(size);         for (Integer i = 0; i < size; i++) {             list.add(i.toString() + "1234567890");         }         return list;     }      /**      * 获得底层是数组的数组      */     public static String[] getArray(Integer size) {         size = (size == null || size <= 0) ? SIZE : size;         String[] list = new String[size];         for (Integer i = 0; i < size; i++) {             list[i] = (i.toString() + "1234567890");         }         return list;     }      /**      * 获得底层是链表的list集合      */     public static List<String> getLinkedList(Integer size) {         size = (size == null || size <= 0) ? SIZE : size;         List<String> list = Lists.newLinkedList();         for (Integer i = 0; i < size; i++) {             list.add(i.toString() + "1234567890");         }         return list;     }      /**      * 获得底层是链表的list集合      */     public static Map<String, String> getMap(Integer size) {         size = (size == null || size <= 0) ? SIZE : size;         Map<String, String> map = Maps.newHashMapWithExpectedSize(size);         for (Integer i = 0; i < size; i++) {             map.put(i.toString(), i.toString());         }         return map;     } } 

文章来源: https://blog.csdn.net/qq_27093465/article/details/91890824
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!