JAVA提高代碼效率的方法課件_第1頁(yè)
JAVA提高代碼效率的方法課件_第2頁(yè)
JAVA提高代碼效率的方法課件_第3頁(yè)
JAVA提高代碼效率的方法課件_第4頁(yè)
JAVA提高代碼效率的方法課件_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、提高代碼效率的方法第1頁(yè),共29頁(yè)。優(yōu)化循環(huán)體循環(huán)是比較重復(fù)運(yùn)行的地方,如果循環(huán)次數(shù)很大,循環(huán)體內(nèi)不好的代碼對(duì)效率的影響就會(huì)被放大而變的突出。讓我們看看下面的代碼片:.Vector vect = new Vector(1000);.for( int i=0; ivect.size(); i+).for循環(huán)部分改寫(xiě)成:int size = vect.size(); for( int i=0; i size; i+).如果size=1000,就可以減少1000次size()的系統(tǒng)調(diào)用開(kāi)銷(xiāo),避免了循環(huán)體重復(fù)調(diào)用。未優(yōu)化耗時(shí):780309優(yōu)化后耗時(shí):624430第2頁(yè),共29頁(yè)。少用NEW初始化一個(gè)實(shí)

2、例盡量少用new來(lái)初始化一個(gè)類(lèi)的實(shí)例,當(dāng)一個(gè)對(duì)象是用new進(jìn)行初始化時(shí),其構(gòu)造函數(shù)鏈的所有構(gòu)造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個(gè)對(duì)象耗時(shí)往往是局部變量賦值耗時(shí)的上千倍。同時(shí),當(dāng)生成對(duì)象后,系統(tǒng)還要花時(shí)間進(jìn)行垃圾回收和處理。當(dāng)new創(chuàng)建對(duì)象不可避免時(shí),注意避免多次的使用new初始化一個(gè)對(duì)象。盡量在使用時(shí)再創(chuàng)建該對(duì)象。如:NewObject object = new NewObject();int value;if( i0 )value =object.getValue();修改為:int value;if ( i 0 )NewObject object = new N

3、ewObject();value =object.getValue(); 另外,應(yīng)該盡量重復(fù)使用一個(gè)對(duì)象,而不是聲明新的同類(lèi)對(duì)象。一個(gè)重用對(duì)象的方法是改變對(duì)象的值,如可以通過(guò)setValue之類(lèi)的方法改變對(duì)象的變量達(dá)到重用的目的。第3頁(yè),共29頁(yè)。在Java中,一切都是對(duì)象,如果有方法(Method)調(diào)用,處理器先要檢查該方法是屬于哪個(gè)對(duì)象,該對(duì)象是否有效,對(duì)象屬于什么類(lèi)型,然后選擇合適的方法并調(diào)用。 可以減少方法的調(diào)用,同樣一個(gè)方法:int i = 0;.CallMethod(i); public void CallMethod(int i )if( i =0 )return;. / 其他處

4、理可修改為:int i = 0;.if( i =0 )CallMethod(i);不影響可讀性等情況下,可以把幾個(gè)小的方法合成一個(gè)大的方法。另外,在方法前加上final,private關(guān)鍵字有利于編譯器的優(yōu)化選擇合適的方法調(diào)用第4頁(yè),共29頁(yè)。盡量使用局部變量 調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴(lài)于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。 例子:public class USER private int _sum; private static int _

5、staticSum; void getSum (int values) for (int i=0; i values.length; i+) _sum += valuesi; / violation. 更正: 如果可能,請(qǐng)使用局部變量作為你經(jīng)常訪問(wèn)的變量。你可以按下面的方法來(lái)修改getSum()方法: void getSum (int values) int sum = _sum; / temporary local variable. for (int i=0; i values.length; i+) sum += valuesi; _sum = sum; 第5頁(yè),共29頁(yè)。STRING與

6、STRINGBUFFER的使用技巧1、字符串在JAVA中被廣泛的使用,但是由于String 對(duì)象是不可改變的, 所以如果我們?cè)噲D將兩個(gè)String對(duì)象相加的時(shí)候,它實(shí)際的執(zhí)行是產(chǎn)生一個(gè)中間對(duì)象StringBuffer,并調(diào)用它的append ()法來(lái)進(jìn)行相加的,最后調(diào)用StringBufffer的toString()方法來(lái)返回一個(gè)String的對(duì)象,如果只是一般的相加差別不大,但是如果是在循環(huán)中,性能差距就較明顯注:String s = “a” + “b” + “c”,實(shí)際上在編譯后是String s=“abc”,執(zhí)行時(shí)不存在相加問(wèn)題 2、在字符串相加的時(shí)候,如果該字符串只有一個(gè)字符的話 如:

7、String str = s + “d”應(yīng)該換作 string = s + d來(lái)執(zhí)行。3、由于在創(chuàng)建一個(gè)StringBuffer對(duì)象時(shí), StringBuffer的構(gòu)造器會(huì)創(chuàng)建一個(gè)默認(rèn)大小(通常是16)的字符數(shù)組。在使用中,如果超出這個(gè)大小,就會(huì)重新分配內(nèi)存,創(chuàng)建一個(gè)更大的數(shù)組,并將原先的數(shù)組復(fù)制過(guò)來(lái),再丟棄舊的數(shù)組。在大多數(shù)情況下,如果可以的話 ,在創(chuàng)建StringBuffer的時(shí)候應(yīng)指定大小,這樣就避免了在容量不夠的時(shí)候自動(dòng)增長(zhǎng),以提高性能。第6頁(yè),共29頁(yè)。返回STRING與STRINGBUFFER的使用技巧第7頁(yè),共29頁(yè)。盡可能的使用Java自身提供的API用JAVA自身的Syste

8、m.arraycopy方法明顯省時(shí)第8頁(yè),共29頁(yè)。不要重復(fù)初始化變量 默認(rèn)情況下,調(diào)用類(lèi)的構(gòu)造函數(shù)時(shí), Java會(huì)把變量初始化成確定的值:所有的對(duì)象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個(gè)類(lèi)從另一個(gè)類(lèi)派生時(shí),這一點(diǎn)尤其應(yīng)該注意,因?yàn)橛胣ew關(guān)鍵詞創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。第9頁(yè),共29頁(yè)。避免不需要的造型操作 所有的類(lèi)都是直接或者間接繼承自O(shè)bject。同樣,所有的子類(lèi)也都隱含的“等于”其父類(lèi)。那么,由子類(lèi)造型至父類(lèi)的操作就是不必要的了。例子:clas

9、s UNC String _id = UNC;class Dog extends UNC void method () Dog dog = new Dog (); UNC animal = (UNC)dog; / not necessary. Object o = (Object)dog; / not necessary. 更正: class Dog extends UNC void method () Dog dog = new Dog(); UNC animal = dog; Object o = dog; 第10頁(yè),共29頁(yè)。如果只是查找單個(gè)字符的話,用CHARAT()代替STARTSW

10、ITH() 用一個(gè)字符作為參數(shù)調(diào)用startsWith()也會(huì)工作的很好,但從性能角度上來(lái)看,調(diào)用charAt更好 例子:public class PCTS private void method(String s) if (s.startsWith(a) / violation / . 更正 將startsWith() 替換成charAt().public class PCTS private void method(String s) if (a = s.charAt(0) / . 第11頁(yè),共29頁(yè)。不要在循環(huán)中調(diào)用SYNCHRONIZED(同步)方法 方法的同步需要消耗相當(dāng)大的資源,在

11、一個(gè)循環(huán)中調(diào)用它絕對(duì)不是一個(gè)好主意。例子:import java.util.Vector;public class SYN public synchronized void method (Object o) private void test () for (int i = 0; i vector.size(); i+) method (vector.elementAt(i); / violation private Vector vector = new Vector (5, 5);第12頁(yè),共29頁(yè)。不要在循環(huán)中調(diào)用SYNCHRONIZED(同步)方法 更正:不要在循環(huán)體中調(diào)用同步方法,

12、如果必須同步的話,推薦以下方式:import java.util.Vector;public class SYN public void method (Object o) private void test () synchronized/在一個(gè)同步塊中執(zhí)行非同步方法 for (int i = 0; i vector.size(); i+) method (vector.elementAt(i); private Vector vector = new Vector (5, 5);第13頁(yè),共29頁(yè)。ORACLE的SQL語(yǔ)句盡量使用大寫(xiě) 在JAVA + ORACLE 的應(yīng)用系統(tǒng)開(kāi)發(fā)中,jav

13、a中內(nèi)嵌的SQL語(yǔ)句盡量使用大寫(xiě)的形式,以減輕ORACLE解析器的解析負(fù)擔(dān)。 第14頁(yè),共29頁(yè)。減少I(mǎi)/O操作盡量減少I(mǎi)/O操作: 輸入/輸出(I/O)包括很多方面,我們知道,進(jìn)行I/O操作是很消耗系統(tǒng)資源的。程序中應(yīng)該盡量少用I/O操作。使用時(shí)可以注意: . 合理控制輸出函數(shù)System.out.println()對(duì)于大多時(shí)候是有用的,特別是系統(tǒng)調(diào)試的時(shí)候,但也會(huì)產(chǎn)生大量的信息出現(xiàn)在控制臺(tái)和日志上,同時(shí)輸出時(shí),有序列化和同步的過(guò)程,造成了開(kāi)銷(xiāo)。特別是在發(fā)行版中,要合理的控制輸出,可以在項(xiàng)目開(kāi)發(fā)時(shí),設(shè)計(jì)好一個(gè)Debug的工具類(lèi),在該類(lèi)中可以實(shí)現(xiàn)輸出開(kāi)關(guān),輸出的級(jí)別,根據(jù)不同的情況進(jìn)行不同的輸

14、出的控制。盡量使用緩存:讀寫(xiě)內(nèi)存要比讀寫(xiě)硬盤(pán)上的文件要快很多,應(yīng)盡可能使用緩沖,以便直接從內(nèi)存中讀取數(shù)據(jù)。盡可能使用帶有Buffer的類(lèi)代替沒(méi)有Buffer的類(lèi),如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來(lái)進(jìn)行處理I/O操作。同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高 第15頁(yè),共29頁(yè)。即時(shí)關(guān)閉I/O流操作 Java 編程過(guò)程中,I/O流操作時(shí)務(wù)必小心,在使用完畢后,及時(shí)關(guān)閉以釋放資源。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開(kāi)銷(xiāo),稍有不慎,會(huì)導(dǎo)致嚴(yán)重的后果。第16頁(yè),共29頁(yè)。在FI

15、NALLY塊中關(guān)閉STREAM程序中使用到的資源應(yīng)當(dāng)被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執(zhí)行的結(jié)果如何,finally塊總是會(huì)執(zhí)行的,以確保資源的正確關(guān)閉。例子:import java.io.*;public class CS public static void main (String args) CS cs = new CS (); cs.method (); public void method () try FileInputStream fis = new FileInputStream (CS.java); int count = 0; while (

16、fis.read () != -1) count+; System.out.println (count); fis.close (); catch (FileNotFoundException e1) catch (IOException e2) 更正:在最后一個(gè)catch后添加一個(gè)finally塊第17頁(yè),共29頁(yè)。對(duì)象使用完畢應(yīng)手動(dòng)置成NULL 由于JVM的有其自身的GC機(jī)制,不需要程序開(kāi)發(fā)者的過(guò)多考慮,從一定程度上減輕了開(kāi)發(fā)者負(fù)擔(dān),但同時(shí)也遺漏了隱患,過(guò)分的創(chuàng)建對(duì)象會(huì)消耗系統(tǒng)的大量?jī)?nèi)存,嚴(yán)重時(shí)會(huì)導(dǎo)致內(nèi)存泄露,因此,保證過(guò)期對(duì)象的及時(shí)回收具有重要意義。JVM回收垃圾的條件是:對(duì)象不在被引

17、用;然而,JVM的GC并非十分的機(jī)智,即使對(duì)象滿足了垃圾回收的條件也不一定會(huì)被立即回收。所以,建議我們?cè)趯?duì)象使用完畢,應(yīng)手動(dòng)置成null。 第18頁(yè),共29頁(yè)。慎用異常 異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。 第19頁(yè),共29頁(yè)。盡量不要在循環(huán)中使用 TRY CATCHTry catch()

18、如無(wú)特殊要求,應(yīng)把其放置在最外層。 比如數(shù)據(jù)回滾第20頁(yè),共29頁(yè)。集合類(lèi)優(yōu)化問(wèn)題集合類(lèi)在此Java編程中被廣泛地使用,一個(gè)集合類(lèi)就是將一組對(duì)象組裝成一個(gè)對(duì)象Java的集合類(lèi)框架由一些接口(如Collection、List、Set、Map)和一些為通用目的而實(shí)現(xiàn)的類(lèi)(如Vector,ArrayList、Hashtable等等)組成,這些類(lèi)里,有些提供了某種排序算法,有的提供了同步的方法,有如此多的集合類(lèi),在具體使用過(guò)程中,我們?nèi)绾胃鶕?jù)自己的需要選擇合適的集合類(lèi),將對(duì)程序的性能產(chǎn)生很大的影響,下面將一些常用的類(lèi)進(jìn)行比較:Vector和ArrayList Vector和ArrayList在使用上非

19、常相似,都可用來(lái)表示一組數(shù)量可變的對(duì)象應(yīng)用的集合,并且可以隨機(jī)地訪問(wèn)其中的元素。它們的區(qū)別如下: 1、Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好.2、當(dāng)Vector或ArrayList中的元素超過(guò)它的初始大小時(shí),Vector會(huì)將它的容量翻倍,而ArrayList只增加50%的大小,這樣ArrayList就有利于節(jié)約內(nèi)存空間。Hashtable和HashMap 它們的性能方面的比較類(lèi)似 Vector和ArrayList,比如Hasht

20、able的方法是同步的,而HashMap的不是。 當(dāng)它們中的元素超過(guò)它的初始大小時(shí),都會(huì)將它的容量翻倍。第21頁(yè),共29頁(yè)。ArrayList和LinkedList 對(duì)于處理一列數(shù)據(jù)項(xiàng),Java提供了兩個(gè)類(lèi)ArrayList和LinkedList,ArrayList的內(nèi)部實(shí)現(xiàn)是基于內(nèi)部數(shù)組Object,所以從概念上講,它更象數(shù)組,但LinkedList的內(nèi)部實(shí)現(xiàn)是基于一組連接的記錄,所以,它更象一個(gè)鏈表結(jié)構(gòu),所以,它們?cè)谛阅苌嫌泻艽蟮牟顒e。 (1)在ArrayList的前面或中間插入數(shù)據(jù)時(shí),你必須將其后的所有數(shù)據(jù)相應(yīng)的后移,這樣必然要花費(fèi)較多時(shí)間,所以,當(dāng)你的操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不

21、是在前面或中間,并且需要隨機(jī)地訪問(wèn)其中的元素時(shí),使用ArrayList會(huì)提供比較好的性能。 (2)訪問(wèn)鏈表中的某個(gè)元素時(shí),就必須從鏈表的一端開(kāi)始沿著連接方向一個(gè)一個(gè)元素地去查找,直到找到所需的元素為止,所以,當(dāng)你的操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問(wèn)其中的元素時(shí),就應(yīng)該使用LinkedList了。 注意:在Java集合框架中的大部分類(lèi)的大小是可以隨著元素個(gè)數(shù)的增加而相應(yīng)的增加的,我們似乎不用關(guān)心它的初始大小,但如果我們考慮類(lèi)的性能問(wèn)題時(shí),就一定要考慮盡可能地設(shè)置好集合對(duì)象的初始大小,這將大大提高代碼的性能,比如,Hashtable缺省的初始大小為11,載入因子為0.75

22、,即如果其中的元素個(gè)數(shù)超過(guò)7個(gè),它就必須增加大小并重新組織元素,所以,如果你知道在創(chuàng)建一個(gè)新的Hashtable對(duì)象時(shí)就知道元素的確切數(shù)目如為12,那么,就應(yīng)將其初始大小設(shè)為12/0.75=16,這樣,就可以避免重新組織內(nèi)存并增加大小。(默認(rèn)Vector ArrayList 10個(gè)大小,Hashtable 11,HashMap 16)集合類(lèi)優(yōu)化問(wèn)題第22頁(yè),共29頁(yè)。第23頁(yè),共29頁(yè)。返回第24頁(yè),共29頁(yè)。不用保存太多的信息在HTTPSESSION中很多時(shí)候,存儲(chǔ)一些對(duì)象在HttpSession中是有必要的,可以加快系統(tǒng)的開(kāi)發(fā),如網(wǎng)上商店系統(tǒng)會(huì)把購(gòu)物車(chē)信息保存在該用戶(hù)的Session中,但

23、當(dāng)存儲(chǔ)大量的信息或是大的對(duì)象在會(huì)話中時(shí),是有害的,特別是當(dāng)系統(tǒng)中用戶(hù)的訪問(wèn)量很大,對(duì)內(nèi)存的需求就會(huì)很高。第25頁(yè),共29頁(yè)。不用保存太多的信息在HTTPSESSION中清除SESSION:通常情況,當(dāng)達(dá)到設(shè)定的超時(shí)時(shí)間時(shí),同時(shí)有些Session沒(méi)有了活動(dòng),服務(wù)器會(huì)釋放這些沒(méi)有活動(dòng)的Session,. 不過(guò)這種情況下,特別是多用戶(hù)并訪時(shí),系統(tǒng)內(nèi)存要維護(hù)多個(gè)的無(wú)效Session。當(dāng)用戶(hù)退出時(shí),應(yīng)該手動(dòng)釋放,回收資源,實(shí)現(xiàn)如下:HttpSession theSession = request.getSession();/ 獲取當(dāng)前Sessionif(theSession != null)theSession.invalidate(); / 使該Session失效第26頁(yè),共29頁(yè)。在JSP頁(yè)面中關(guān)閉無(wú)用的會(huì)話一個(gè)常見(jiàn)的誤解是以為session在有客戶(hù)端訪問(wèn)時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語(yǔ)句時(shí)才被創(chuàng)建,注意如果JSP沒(méi)有顯示的使用 關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語(yǔ)句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對(duì)象的來(lái)歷。由于sessio

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論