由for迴圈引發的思考
阿新 • • 發佈:2019-01-09
最近看到一篇帖子 討論for迴圈問題,for迴圈如下
arr是一個數組
一種是
for(int i = 0;i<arr.len;i++) {
A a = arr[i];
System.out.println(a);
}
另一種是
A a = null;
for(int i = 0;i<arr.len;i++) {
a = arr[i];
System.out.println(a);
}
對以上兩種for迴圈的寫法,討論的很是激烈,看完討論,覺得有位老兄說的比較準確,於是總結了下,有說錯的地方,請指正, :D
第一種
這樣做的優點是 縮小了引用A的作用範圍. 但是每次把一個物件引用賦值給一個變數,佔用棧記憶體較多,因為物件始終被變數引用,不一定被列為被回收物件
第二種
這樣做的話 , 只聲明瞭一次.但是在一些特殊情況下 比如所在的函式很長, 需要執行很多的時間. 那麼,a變數將一直指向arr[arr.len-1],又恰好 arr[arr.len-1]在後來某操作而被彈出了arr陣列.也就是從arr陣列中被刪除了.但是a還沒有過期,所以即使GC在這段時間內工作了,這個物件也不會被回收. 這時前面迴圈的許多物件已經沒有被變數引用,可以稱之為廢棄的,應該會優先被列為回收物件
由此 引發了我對for迴圈的比較:經過測試(百萬)
對於for迴圈 我的建議是改成如下形式
A a = null;
for(int i = arr.len-1;i>=0;i--) {
a = arr[i];
System.out.println(a);
}
改成這種形式,效率是最高的,經過我的對三種for迴圈 正序,倒序,高階for比較效率從高到低為:倒序,正序,高階for;
並且對於巢狀for我也進行了測試
如果要進行巢狀for那最好把迴圈少的for放在最外面,這樣減少cpu對for迴圈的切換,效率提升很明顯,大家可以自己測試下,基本都是相反情況的一半。希望自己的測試能給大家帶來一點程式設計的啟示吧。哈哈 趁這會有空趕緊寫下來
arr是一個數組
一種是
for(int i = 0;i<arr.len;i++) {
A a = arr[i];
System.out.println(a);
}
另一種是
A a = null;
for(int i = 0;i<arr.len;i++) {
a = arr[i];
System.out.println(a);
}
對以上兩種for迴圈的寫法,討論的很是激烈,看完討論,覺得有位老兄說的比較準確,於是總結了下,有說錯的地方,請指正, :D
第一種
這樣做的優點是 縮小了引用A的作用範圍. 但是每次把一個物件引用賦值給一個變數,佔用棧記憶體較多,因為物件始終被變數引用,不一定被列為被回收物件
第二種
這樣做的話 , 只聲明瞭一次.但是在一些特殊情況下 比如所在的函式很長, 需要執行很多的時間. 那麼,a變數將一直指向arr[arr.len-1],又恰好 arr[arr.len-1]在後來某操作而被彈出了arr陣列.也就是從arr陣列中被刪除了.但是a還沒有過期,所以即使GC在這段時間內工作了,這個物件也不會被回收. 這時前面迴圈的許多物件已經沒有被變數引用,可以稱之為廢棄的,應該會優先被列為回收物件
由此 引發了我對for迴圈的比較:經過測試(百萬)
對於for迴圈 我的建議是改成如下形式
A a = null;
for(int i = arr.len-1;i>=0;i--) {
a = arr[i];
System.out.println(a);
}
改成這種形式,效率是最高的,經過我的對三種for迴圈 正序,倒序,高階for比較效率從高到低為:倒序,正序,高階for;
並且對於巢狀for我也進行了測試
如果要進行巢狀for那最好把迴圈少的for放在最外面,這樣減少cpu對for迴圈的切換,效率提升很明顯,大家可以自己測試下,基本都是相反情況的一半。希望自己的測試能給大家帶來一點程式設計的啟示吧。哈哈 趁這會有空趕緊寫下來