for循環內外創建對象的區別,哪個性能更優?
for循環內創建對象,就像這樣的代碼:
List<DriverTrack> driverTracks = driverService.selectDriverTrackByExample(example); List<TrackVo> list = new ArrayList<TrackVo>(); if (driverTracks != null && driverTracks.size() > 0) { for (DriverTrack driverTrack : driverTracks) { TrackVo trackVo = new TrackVo(); trackVo.setLat(driverTrack.getLatitude()); trackVo.setLng(driverTrack.getLongitude()); list.add(trackVo); } }
for循環外創建對象,就像這樣的代碼:
List<DriverTrack> driverTracks = driverService.selectDriverTrackByExample(example); List<TrackVo> list = new ArrayList<TrackVo>(); if (driverTracks != null && driverTracks.size() > 0) { TrackVo trackVo = null; for (DriverTrack driverTrack : driverTracks) { trackVo = new TrackVo(); trackVo.setLat(driverTrack.getLatitude()); trackVo.setLng(driverTrack.getLongitude()); list.add(trackVo); } }
兩者寫法的對比存在爭議,有如下觀點:
- A認為后者比前者要好(因為這樣寫只創建了一個對象的引用,也就是在for循環里面去new對象的時候,都只是將這個引用指向不同的對象);
- B認為隨着JDK不斷升級迭代,兩者效率是一樣;
- C認為JVM早就解決這樣的問題,無需擔心。
我的看法:
我更偏向於for循環體內定義對象,因為我一直的寫法也是如此,特別是JDK從過去的1.5到現在,JDK已經有15了,像這樣的問題JDK開發者早已經替我們考慮好了(Java不像C++,對內存的把控非常嚴,因為已經有JVM替我們管理了,我們只需專注於業務)。
但是從另外一個角度來看,弄清楚為什么比僅僅停留在使用層面,能讓我們對於這項技術有更深入的了解和掌握,深入的了解和掌握能讓我們走得更遠。最近公司領導就特別建議在循環體外定義對象而非在循環體內定義對象。
接着留一個問題,供我以及感興趣的讀者實踐研究?
for循環體外性能對比,拿出實際的數據證明兩者的優劣。
參考資料如下:
【JAVA】變量聲明在循環體內還是循環體外的爭論,以及怎樣才真正叫『避免在循環體中創建對象』?