Java中列表幾種迴圈遍歷方式的耗時對比(for/foreach/stream/parallelStream)
阿新 • • 發佈:2020-12-10
技術標籤: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流處理就是通過犧牲時間,節約了空間,開發過程中視情況而定吧,不要盲目的使用~