1. 程式人生 > 其它 >Java中列表幾種迴圈遍歷方式的耗時對比(for/foreach/stream/parallelStream)

Java中列表幾種迴圈遍歷方式的耗時對比(for/foreach/stream/parallelStream)

技術標籤:Java基礎篇Javajavalambdastream

栗子:定義一個數組,賦值十萬條資料。然後分別使用四種方式遍歷該陣列、取出name不包含4的所有列表

直接上程式碼,如下:


    public static void main(String[] args) throws Exception {
        List<IntegerIdAndNameEntity> list = new ArrayList<>();

        for (int i = 1; i <= 100000; i++) {
            IntegerIdAndNameEntity idAndNameEntity = new IntegerIdAndNameEntity();
            idAndNameEntity.setId(i);
            idAndNameEntity.setName("第" + i + "個");
            list.add(idAndNameEntity);
        }
        System.out.println("初始化後的總長度===" + list.size());
        System.out.println("***************************");

        f_1(list);
        f_2(list);
        f_3(list);
        f_4(list);
    }

    private static void f_1(List<IntegerIdAndNameEntity> list) {
        List<IntegerIdAndNameEntity> targetList = new ArrayList<>();
        long f1_start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            if (!list.get(i).getName().contains("4")) {
                targetList.add(list.get(i));
            }
        }
        long f1_end = System.currentTimeMillis();
        System.out.println("第一種查詢方式耗時===" + (f1_end - f1_start));
        System.out.println("第一種查詢方式過濾後的長度===" + targetList.size());
        System.out.println("***************************");
    }

    private static void f_2(List<IntegerIdAndNameEntity> list) {
        List<IntegerIdAndNameEntity> targetList = new ArrayList<>();
        long f2_start = System.currentTimeMillis();
        for (IntegerIdAndNameEntity idAndNameEntity : list) {
            if (!idAndNameEntity.getName().contains("4")) {
                targetList.add(idAndNameEntity);
            }
        }
        long f2_end = System.currentTimeMillis();
        System.out.println("第二種查詢方式耗時===" + (f2_end - f2_start));
        System.out.println("第二種查詢方式過濾後的長度===" + targetList.size());
        System.out.println("***************************");

    }

    private static void f_3(List<IntegerIdAndNameEntity> list) {
        long f3_start = System.currentTimeMillis();
        List<IntegerIdAndNameEntity> targetList = list.stream().filter(d -> !d.getName().contains("4")).collect(Collectors.toList());
        long f3_end = System.currentTimeMillis();
        System.out.println("第三種查詢方式耗時===" + (f3_end - f3_start));
        System.out.println("第三種查詢方式過濾後的長度===" + targetList.size());
        System.out.println("***************************");

    }

    private static void f_4(List<IntegerIdAndNameEntity> list) {
        long f4_start = System.currentTimeMillis();
        List<IntegerIdAndNameEntity> targetList = list.parallelStream().filter(d -> !d.getName().contains("4")).collect(Collectors.toList());
        long f4_end = System.currentTimeMillis();
        System.out.println("第四種查詢方式耗時===" + (f4_end - f4_start));
        System.out.println("第四種查詢方式過濾後的長度===" + targetList.size());
    }

列印結果:

初始化後的總長度===100000
***************************
第一種查詢方式耗時===13
第一種查詢方式過濾後的長度===59049
***************************
第二種查詢方式耗時===10
第二種查詢方式過濾後的長度===59049
***************************
第三種查詢方式耗時===54
第三種查詢方式過濾後的長度===59049
***************************
第四種查詢方式耗時===10
第四種查詢方式過濾後的長度===59049

通過對比可以看出第三種方式耗時最長、第一和第二差不多(同一個方法內第一個比第二個耗時少,方法傳遞之後就是第二個比第一個耗時少,後續再研究

第四種方式需要注意的是執行緒安全的問題

stream流處理就是通過犧牲時間,節約了空間,開發過程中視情況而定吧,不要盲目的使用~