title: Java-for循環那些事
toc: true
date: 2019-05-21 10:28:44
categories: Java
tags:
- Tips
---java
在for循環裏二者的做用是同樣的數組
i++測試
for(int i=0; i<5; i++){ System.out.print(i + ","); } >> 0, 1, 2, 3, 4
++i優化
for(int i=0; i<5; ++i){ System.out.print(i + ","); } >> 0, 1, 2, 3, 4
工做原理code
i++ip
{ System.out.print(i + ","); i++; }
++iget
{ System.out.print(i + ","); ++i; }
區別it
在Java裏面,i++ 須要開闢新的存儲空間用於存儲結果,++i 直接在原存儲空間中存儲結果。故 ++i** 在 for 循環裏面執行效率要高。** 能夠做爲代碼優化的一部分。for循環
首先測試數組class
// 測試for循環 int[] A = new int[100000000]; long startTime = System.nanoTime(); int len = A.length; int res = 0; for(int i=0; i<len; i++){ res += A[i]; } long endTime = System.nanoTime(); System.out.println("for循環: "+(endTime- startTime)); // 測試foreach int[] A = new int[100000000]; long startTime = System.nanoTime(); int len = A.length; int res = 0; for(Integer i: A){ res += i; } long endTime = System.nanoTime(); System.out.println("foreach循環: "+(endTime- startTime));
結果
for循環: 37143324 forecah循環: 75450311
可見對於大數組採用for循環效率更高
再測試ArrayList
ArrayList<Integer> list = new ArrayList<>(30000000); for(int i=0; i<30000000; i++){ list.add(i); } // 測試for循環 long startTime = System.nanoTime(); int size = list.size(); int res = 0; for(int i=0; i<size; i++){ res += list.get(i); } long endTime = System.nanoTime(); System.out.println("for循環: "+(endTime- startTime)); // 測試foreach long startTime = System.nanoTime(); int res = 0; for(Integer i: list){ res += i; } long endTime = System.nanoTime(); System.out.println("foreach循環: "+(endTime- startTime));
結果
Java for循環: 39368248 forecah循環: 42177137
可見對於ArrayList仍然是採用for循環效率更高!
循環嵌套採用小套大。原理跟複製幾個大文件跟複製一堆小文件耗時同樣。
測試
long startTime = System.nanoTime(); int res = 0; // 大套小 for(int i=0; i<10000000; i++){ for(int j=0; j<100; j++){ res += i; } } long endTime = System.nanoTime(); System.out.println("大套小: "+(endTime- startTime));
// 小套大 for(int i=0; i<100; i++){ for(int j=0; j<10000000; j++){ res += i; } } long endTime = System.nanoTime(); System.out.println("小套大: "+(endTime- startTime));
結果
大套小: 57934223 小套大: 4918044
在循環時,首先把ArrayList長度size記錄下來。
測試
ArrayList<Integer> list = new ArrayList<>(30000000); for(int i=0; i<30000000; i++){ list.add(i); } long startTime = System.nanoTime(); //先把長度保存下來 int len = list.size(); int res = 0; for(int i=0; i<len; i++){ res += list.get(i); } long endTime = System.nanoTime(); System.out.println("保存size(): "+(endTime- startTime)); //沒有保存size() for(int i=0; i<list.size(); i++){ res += list.get(i); } long endTime = System.nanoTime(); System.out.println("沒有保存size(): "+(endTime- startTime));
結果
保存size(): 38973440 沒有保存size(): 39486862