java代碼優(yōu)化(盡量減少創(chuàng)建不必要對(duì)象)

代碼優(yōu)化細(xì)節(jié)

(1)盡量指定類、方法的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String,整個(gè)類都是final的。為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫。如果指定了一個(gè)類為final,則該類所有的方法都是final的。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)所有的final方法,內(nèi)聯(lián)對(duì)于提升Java運(yùn)行效率作用重大。

(2)盡量重用對(duì)象
特別是String對(duì)象的使用,出現(xiàn)字符串連接時(shí)應(yīng)該使用StringBuilder/StringBuffer代替。由于Java虛擬機(jī)不僅要花時(shí)間生成對(duì)象,以后可能還需要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理,因此,生成過多的對(duì)象將會(huì)給程序的性能帶來很大的影響。

(3)盡可能使用局部變量
調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧中,速度較快,其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆中創(chuàng)建,速度較慢。另外,棧中創(chuàng)建的變量,隨著方法的運(yùn)行結(jié)束,這些內(nèi)容就沒了,不需要額外的垃圾回收。

(4)及時(shí)關(guān)閉流
Java編程過程中,進(jìn)行數(shù)據(jù)庫連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,及時(shí)關(guān)閉以釋放資源。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開銷,稍有不慎,將會(huì)導(dǎo)致嚴(yán)重的后果。

(5)盡量減少對(duì)變量的重復(fù)計(jì)算
明確一個(gè)概念,對(duì)方法的調(diào)用,即使方法中只有一句語句,也是有消耗的,包括創(chuàng)建棧幀、調(diào)用方法時(shí)保護(hù)現(xiàn)場、調(diào)用方法完畢時(shí)恢復(fù)現(xiàn)場等。所以例如下面的操作:

for (int i = 0; i < list.size(); i++)
{...}

建議改寫成:

for (int i = 0, length = list.size(); i < length; i++)
{...}

這樣,在list.size()很大的時(shí)候,就減少了很多的消耗。(本人以前會(huì)犯,以后注意改進(jìn))

(6)盡量采用懶加載的策略,即在需要的時(shí)候才創(chuàng)建
例如:

String str = "aaa";
if (i == 1)
{
  list.add(str);
}

建議改寫成:

if (i == 1)
{
  String str = "aaa";
  list.add(str);
}

這條我在之前工作經(jīng)常會(huì)犯,以后注意改善。

(7)慎用異常
異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地同步方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,Java虛擬機(jī)就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^程中創(chuàng)建了一個(gè)新的對(duì)象。異常只能用于錯(cuò)誤處理,不應(yīng)該用來控制程序流程。

(8)不要在循環(huán)中使用try...catch...,應(yīng)該把其放在最外層。

(9)循環(huán)內(nèi)不要不斷創(chuàng)建對(duì)象引用。
例如:

for (int i = 1; i <= count; i++)
{
    Object obj = new Object();    
}

這種做法會(huì)導(dǎo)致內(nèi)存中有count份Object對(duì)象引用存在,count很大的話,就耗費(fèi)內(nèi)存了,建議為改為:
建議改為:

Object obj = null;
for (int i = 0; i <= count; i++)
{
    obj = new Object();
}

這樣的話,內(nèi)存中只有一份Object對(duì)象引用,每次new Object()的時(shí)候,Object對(duì)象引用指向不同的Object罷了,但是內(nèi)存中只有一份,這樣就大大節(jié)省了內(nèi)存空間了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容