摘要:接觸這么久以來,相信很多程序員都被這種代碼性能優(yōu)化策略所誤導。所以,建議使用循環(huán)內定義變量,這種把變量的生命周期限制在循環(huán)體范圍內,也不會出現業(yè)務上重用變量而導致嚴重的問題。
我們經常看到一些 Java 性能優(yōu)化的書或者理念,說不要在循環(huán)內定義變量,這樣會占用過多的內存影響性能,而要在循環(huán)外面定義。接觸 Java 這么久以來,相信很多 Java 程序員都被這種代碼性能優(yōu)化策略所誤導。
看下面兩個示例,示例1在循環(huán)外定義變量,示例2是在循環(huán)內定義變量。
/** * 循環(huán)外定義變量 */ private static void outer() { Javastack javastack = null; for (int i = 0; i < 10; i++) { javastack = new Javastack(); } } /** * 循環(huán)內定義變量 */ private static void inner() { for (int i = 0; i < 10; i++) { Javastack javastack = new Javastack(); } }
先來分析這兩個示例吧。
循環(huán)外定義變量循環(huán)外定義變量,變量循環(huán)內每次引用指向不同的對象實例,每次循環(huán)變更對象實例時,上一次被指向的對象就會被銷毀,直到最后一個循環(huán)。這樣,循環(huán)結束后,這個變量還存在,并指向循環(huán)內最后一個對象實例,其他對象都銷毀了。
這樣,本應該是循環(huán)體內的生命周期變量被擴散到了循環(huán)外,如果循環(huán)外依舊用這個變量,會導致后面的業(yè)務發(fā)生不可預知的后果。這種問題在筆者工作當中經常會遇到,看下面的例子。
/** * 循環(huán)外定義變量 */ private static void outer() { Javastack javastack1 = null; for (int i = 0; i < 10; i++) { javastack1 = new Javastack(); } Javastack javastack2 = userDao.getUser(10); }
上面定義了一個 javastack2 ,如果此時在后續(xù)代碼或者傳遞到別的方法時寫錯了,用了 javastack1,那這時不就有問題了嗎?這只是一方面,還有如果用同一變量名,當這一變量被重用時發(fā)生異常,本來發(fā)生異常應該是 null 值的,結果得到了是之前循環(huán)體內的值。
循環(huán)內定義變量循環(huán)內定義變量,和循環(huán)外略有不同的是,每次都會創(chuàng)建新的局部變量指向新的對象實例,每個變量和對象的生命周期僅限于在循環(huán)體之內,而且每次循環(huán)結束該局部變量和對象實例都會隨著循環(huán)體的結束而銷毀,所以不存在占用更多的內存這一說法。
總結兩種用法都會創(chuàng)建相同數量的對象實例,只不過循環(huán)內會反復創(chuàng)建相同數量的局部變量,棧內存垃圾回收頻率也會更高,但對于堆垃圾回收帶來的性能影響和變量生命周期帶來的業(yè)務影響來說,棧內存這點性能影響可以忽略不計。
所以,建議使用循環(huán)內定義變量,這種把變量的生命周期限制在循環(huán)體范圍內,也不會出現業(yè)務上重用變量而導致嚴重的問題。
推薦:Spring Boot & Cloud 最強技術教程
掃描關注我們的微信公眾號,干貨每天更新。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71457.html
摘要:月底了,又到了我們總結這一個月技術干貨的時候了,又到了我們給粉絲免費送書的日子了。 月底了,又到了我們總結這一個月 Java 技術干貨的時候了,又到了我們給粉絲免費送書的日子了。 7 月份干貨總結 Oracle 發(fā)布了一個全棧虛擬機 GraalVM 一文帶你深入拆解 Java 虛擬機 圖文帶你了解 8 大排序算法 Spring Boot 2.x 新特性總結及遷移指南 Spring B...
摘要:降級往往會指定不同的級別,面臨不同的異常等級執(zhí)行不同的處理。談談你對和的認識兩者關系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務框架到微服務生態(tài)與并不是競爭關系,作為成熟的框架,其易用性擴展性和健壯性已得到業(yè)界的認可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...
摘要:降級往往會指定不同的級別,面臨不同的異常等級執(zhí)行不同的處理。談談你對和的認識兩者關系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務框架到微服務生態(tài)與并不是競爭關系,作為成熟的框架,其易用性擴展性和健壯性已得到業(yè)界的認可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質文章請猛戳GitHub博客,一年百來篇優(yōu)質文章等著你! 如果你錯過了前面的章節(jié),可...
閱讀 1448·2021-09-22 16:04
閱讀 2806·2019-08-30 15:44
閱讀 893·2019-08-30 15:43
閱讀 771·2019-08-29 15:24
閱讀 1852·2019-08-29 14:07
閱讀 1140·2019-08-29 12:30
閱讀 1734·2019-08-29 11:15
閱讀 2747·2019-08-28 18:08