激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務(wù)器之家 - 編程語言 - JAVA教程 - Java性能優(yōu)化技巧匯總

Java性能優(yōu)化技巧匯總

2019-12-16 13:25司青 JAVA教程

這篇文章主要介紹了Java性能優(yōu)化技巧,匯總了提升java程序性能的常用技巧,非常具有實(shí)用價值,需要的朋友可以參考下

本文實(shí)例匯總了Java性能優(yōu)化技巧。分享給大家供大家參考。具體分析如下:

這里參考了些書籍,網(wǎng)絡(luò)資源整理出來,適合于大多數(shù)Java應(yīng)用

在JAVA程序中,性能問題的大部分原因并不在于JAVA語言,而是程序本身。養(yǎng)成良好的編碼習(xí)慣非常重要,能夠顯著地提升程序性能。

1.盡量使用final修飾符。

帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應(yīng)用final的例子,例如java.lang.String。為String類指定final防止了使用者覆蓋length()方法。另外,如果一個類是final的,則該類所有方法都是final的。java編譯器會尋找機(jī)會內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現(xiàn)有關(guān))。此舉能夠使性能平均提高50%。

2.盡量重用對象。

特別是String對象的使用中,出現(xiàn)字符串連接情況時應(yīng)使用StringBuffer代替,由于系統(tǒng)不僅要花時間生成對象,以后可能還需要花時間對這些對象進(jìn)行垃圾回收和處理。因此生成過多的對象將會給程序的性能帶來很大的影響。

3.盡量使用局部變量。

調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量,實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。

4.不要重復(fù)初始化變量。

默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時,java會把變量初始化成確定的值,所有的對象被設(shè)置成null,整數(shù)變量設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個類從另一個類派生時,這一點(diǎn)尤其應(yīng)該注意,因?yàn)橛胣ew關(guān)鍵字創(chuàng)建一個對象時,構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會被自動調(diào)用。
這里有個注意,給成員變量設(shè)置初始值但需要調(diào)用其他方法的時候,最好放在一個方法比如initXXX()中,因?yàn)橹苯诱{(diào)用某方法賦值可能會因?yàn)轭惿形闯跏蓟鴴伩罩羔槷惓#琾ublic int state = this.getState();

5.在java+Oracle的應(yīng)用系統(tǒng)開發(fā)中,java中內(nèi)嵌的SQL語言應(yīng)盡量使用大寫形式,以減少Oracle解析器的解析負(fù)擔(dān)。

6.java編程過程中,進(jìn)行數(shù)據(jù)庫連接,I/O流操作,在使用完畢后,及時關(guān)閉以釋放資源。因?yàn)閷@些大對象的操作會造成系統(tǒng)大的開銷。

7.過分的創(chuàng)建對象會消耗系統(tǒng)的大量內(nèi)存,嚴(yán)重時,會導(dǎo)致內(nèi)存泄漏,因此,保證過期的對象的及時回收具有重要意義。
JVM的GC并非十分智能,因此建議在對象使用完畢后,手動設(shè)置成null。

8.在使用同步機(jī)制時,應(yīng)盡量使用方法同步代替代碼塊同步。

9.盡量減少對變量的重復(fù)計(jì)算。

比如

?
1
for(int i=0;i<list.size();i++)

應(yīng)修改為

?
1
for(int i=0,len=list.size();i<len;i++)

10.采用在需要的時候才開始創(chuàng)建的策略。

例如:

?
1
2
String str="abc";
if(i==1){ list.add(str);}

應(yīng)修改為:

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

11.慎用異常,異常對性能不利。

拋出異常首先要創(chuàng)建一個新的對象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地方法,fillInStackTrace()方法檢查棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用棧,因?yàn)樵谔幚磉^程中創(chuàng)建了一個新的對象。

異常只能用于錯誤處理,不應(yīng)該用來控制程序流程。

12.不要在循環(huán)中使用Try/Catch語句,應(yīng)把Try/Catch放在循環(huán)最外層。

Error是獲取系統(tǒng)錯誤的類,或者說是虛擬機(jī)錯誤的類。不是所有的錯誤Exception都能獲取到的,虛擬機(jī)報錯Exception就獲取不到,必須用Error獲取。

13.通過StringBuffer的構(gòu)造函數(shù)來設(shè)定他的初始化容量,可以明顯提升性能。

StringBuffer的默認(rèn)容量為16,當(dāng)StringBuffer的容量達(dá)到最大容量時,她會將自身容量增加到當(dāng)前的2倍+2,也就是2*n+2。無論何時,只要StringBuffer到達(dá)她的最大容量,她就不得不創(chuàng)建一個新的對象數(shù)組,然后復(fù)制舊的對象數(shù)組,這會浪費(fèi)很多時間。所以給StringBuffer設(shè)置一個合理的初始化容量值,是很有必要的!

14.合理使用java.util.Vector。

Vector與StringBuffer類似,每次擴(kuò)展容量時,所有現(xiàn)有元素都要賦值到新的存儲空間中。Vector的默認(rèn)存儲能力為10個元素,擴(kuò)容加倍。

vector.add(index,obj) 這個方法可以將元素obj插入到index位置,但index以及之后的元素依次都要向下移動一個位置(將其索引加 1)。 除非必要,否則對性能不利。

同樣規(guī)則適用于remove(int index)方法,移除此向量中指定位置的元素。將所有后續(xù)元素左移(將其索引減 1)。返回此向量中移除的元素。所以刪除vector最后一個元素要比刪除第1個元素開銷低很多。刪除所有元素最好用removeAllElements()方法。

如果要刪除vector里的一個元素可以使用 vector.remove(obj);而不必自己檢索元素位置,再刪除,如int index = indexOf(obj);vector.remove(index);

15.當(dāng)復(fù)制大量數(shù)據(jù)時,使用System.arraycopy();

16.代碼重構(gòu),增加代碼的可讀性。

17.不用new關(guān)鍵字創(chuàng)建對象的實(shí)例。

用new關(guān)鍵詞創(chuàng)建類的實(shí)例時,構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會被自動調(diào)用。但如果一個對象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用她的clone()方法。clone()方法不會調(diào)用任何類構(gòu)造函數(shù)。

下面是Factory模式的一個典型實(shí)現(xiàn)。

?
1
2
3
4
5
6
7
8
9
10
public static Credit getNewCredit()
{
  return new Credit();
}
改進(jìn)后的代碼使用clone()方法,
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit()
{
  return (Credit)BaseCredit.clone();
}

18.乘除法如果可以使用位移,應(yīng)盡量使用位移,但最好加上注釋,因?yàn)槲灰撇僮鞑恢庇^,難于理解。

19.不要將數(shù)組聲明為:public static final。

20.HaspMap的遍歷。

?
1
2
3
4
5
6
Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Entry<String, String[]> entry : paraMap.entrySet() )
{
  String appFieldDefId = entry.getKey();
  String[] values = entry.getValue();
}

利用散列值取出相應(yīng)的Entry做比較得到結(jié)果,取得entry的值之后直接取key和value。

21.array(數(shù)組)和ArrayList的使用。

array 數(shù)組效率最高,但容量固定,無法動態(tài)改變,ArrayList容量可以動態(tài)增長,但犧牲了效率。

22.單線程應(yīng)盡量使用 HashMap, ArrayList,除非必要,否則不推薦使用HashTable,Vector,她們使用了同步機(jī)制,而降低了性能。

23.StringBuffer,StringBuilder的區(qū)別在于:java.lang.StringBuffer 線程安全的可變字符序列。一個類似于String的字符串緩沖區(qū),但不能修改。StringBuilder與該類相比,通常應(yīng)該優(yōu)先使用StringBuilder類,因?yàn)樗С炙邢嗤牟僮鳎捎谒粓?zhí)行同步,所以速度更快。為了獲得更好的性能,在構(gòu)造StringBuffer或StringBuilder時應(yīng)盡量指定她的容量。當(dāng)然如果不超過16個字符時就不用了。
相同情況下,使用StringBuilder比使用StringBuffer僅能獲得10%~15%的性能提升,但卻要冒多線程不安全的風(fēng)險。綜合考慮還是建議使用StringBuffer。

24.盡量使用基本數(shù)據(jù)類型代替對象。

25.用簡單的數(shù)值計(jì)算代替復(fù)雜的函數(shù)計(jì)算,比如查表方式解決三角函數(shù)問題。

26.使用具體類比使用接口效率高,但結(jié)構(gòu)彈性降低了,但現(xiàn)代IDE都可以解決這個問題。

27.考慮使用靜態(tài)方法

如果你沒有必要去訪問對象的外部,那么就使你的方法成為靜態(tài)方法。她會被更快地調(diào)用,因?yàn)樗恍枰粋€虛擬函數(shù)導(dǎo)向表。這同事也是一個很好的實(shí)踐,因?yàn)樗嬖V你如何區(qū)分方法的性質(zhì),調(diào)用這個方法不會改變對象的狀態(tài)。

28.應(yīng)盡可能避免使用內(nèi)在的GET,SET方法。

android編程中,虛方法的調(diào)用會產(chǎn)生很多代價,比實(shí)例屬性查詢的代價還要多。我們應(yīng)該在外包調(diào)用的時候才使用get,set方法,但在內(nèi)部調(diào)用的時候,應(yīng)該直接調(diào)用。

29.避免枚舉,浮點(diǎn)數(shù)的使用。

30.二維數(shù)組比一維數(shù)組占用更多的內(nèi)存空間,大概是10倍計(jì)算。

31.SQLite數(shù)據(jù)庫讀取整張表的全部數(shù)據(jù)很快,但有條件的查詢就要耗時30-50MS,大家做這方面的時候要注意,盡量少用,尤其是嵌套查找!

希望本文所述對大家的java程序設(shè)計(jì)有所幫助。

延伸 · 閱讀

精彩推薦
267
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产乱乱视频 | 日本在线观看中文字幕 | 性生活香蕉视频 | 最新日本中文字幕在线观看 | av在线高清观看 | 黄色片在线免费播放 | 午夜视频大全 | 国产午夜精品一区二区三区视频 | 国产成人精品区 | 另类亚洲孕妇分娩网址 | 亚洲国产高清一区 | 亚洲综合一区二区三区 | 91短视频在线视频 | 中文字幕在线播放不卡 | 性大片免费看 | 午夜视频国产 | 91精品片| 欧美精品一区二区久久久 | 日韩每日更新 | 国产一级中文字幕 | 亚洲热线99精品视频 | 成人在线观看一区二区 | 中国的免费的视频 | 一级电影免费看 | 亚洲午夜久久久久 | 亚洲视频综合 | 小雪奶水翁胀公吸小说最新章节 | 国产成人网 | 在线观看中文字幕av | 久久久久久久一区二区三区 | 伊人二本二区 | 成年性羞羞视频免费观看无限 | 91不卡在线 | 三人弄娇妻高潮3p视频 | av成人免费在线观看 | 激情综合婷婷久久 | 欧美成人免费电影 | 午夜一级 | sesee99 | 亚洲国产精品久久久 | 久久蜜臀一区二区三区av |