Java程式設計效能優化技巧分享

針對大家的提問Java程式設計效能優化技巧有哪些,小編特意收集了以下的解答內容,希望對您有所幫助!更多內容請關注應屆畢業生考試網!

Java程式設計效能優化技巧分享

1、字串優化處理

(1)String類的特點:不變性、針對常量池的優化(rn()方法的意義)

(2)subString方法的記憶體洩漏:

(3)字串分割和查詢不要使用split函式,效率低,而是使用StringTokenizer或者indexOf結合subString()函式完成分割。

(4)用charAt()方法代替startWith()方法。

(5)對於靜態字串或者變數字串的連線操作,Java在編譯的時候會進行徹底的優化,將多個連線操作的字串在編譯時合成一個單獨的字串,而不是生成大量的String例項。只生成一個物件。

(6)在無需考慮執行緒安全情況下儘量使用StringBuilder。

(7)StringBuffer和StringBuilder初始化的時候都可以設定一個初始值,預設是16B。如果字串的長度大於16B的時候,則需要進行擴容。擴容策略是將原有的容量大小翻倍,以新的容量申請記憶體空間,建立char陣列,然後將陣列中的內容複製到這個新的陣列中,使用Of()函式。因此,如果能預先評估StringBuilder的大小,則可以節省這些複製操作,從而提高系統的效能。

2、List介面

(1)ArrayList和Vector的區別:它們幾乎使用了相同的演算法,它們的唯一區別是對多執行緒的支援。ArrayList是不安全的,而Vector是執行緒安全的。

(2)LinkedList和ArrayList的區別:

|---1、linkedList採用連結串列實現,適合於資料刪除和插入非常頻繁的情況,不適合隨機訪問。

|---2、ArrayList採用陣列實現,適用於隨機查詢和順序讀的情況,不適合刪除和插入資料非常頻繁的場景。

(3)基於陣列的List都會有一個容量引數。當ArrayList所儲存的元素容量超過其已有大小的時候就會進行擴容,陣列的擴容會導致整個陣列進行一次記憶體複製。因此合理的陣列大小會減小陣列擴容的次數從而提高系統性能。

(4)遍歷列表的時候儘量使用迭代器,速度塊。

2、Map介面:

(1)HashMap的實現原理:簡單的說,HashMap就是將key做hash演算法,然後將hash值對映到記憶體地址,直接取得key所對應的資料。在HashMap中,底層資料結構使用的是陣列,所謂的記憶體地址指的是陣列的下標索引。

(2)容量引數與擴容:預設情況下,hashmap的初始容量為16,負載因子為0.75,也就是說當hashmap的實際容量達到了初始容量*負載因子(hashmap內部維護的一個threshold值)的時候,hashmap就會進行擴容。在擴容時,會遍歷整個hashmap,因此應該設定合理的初始大小和負載因子,可以減小hashmap擴容的次數。

(3)LinkedHashMap--有序的HashMap:HashMap的最大缺點是其無序性,被存入到Hashmap 中的`元素,在遍歷HashMap的時候,其輸出不一定按照輸入的順序,而是HashMap會根據hash演算法設定一個查詢高效的順序。如果希望儲存輸入順序,則需要使用LinkedHashMap。LinkedHashmap在內部又增加了一個連結串列,用於儲存元素的順序。

(4)LinkedList可以提供兩種型別的順序:一個是元素插入時候的順序,一個是最近訪問的順序。注意:LinkedHashMap在迭代過程中,如果設定為按照最後訪問時間進行排序,即:每當使用get()方法訪問某個元素時,該元素便會移動到連結串列的尾端。但是這個時候會出現異常,因此,LinkedHashMap工作在這種模式的時候,不能在迭代器中使用get()操作。

(5)關於ConcurrentModificationException:該異常一般會在集合迭代過程中被修改時丟擲。因此,不要在迭代器模式中修改集合的結構。這個特性適合於所有的集合類,包括HashMap、Vector、ArrayList等。

(6)TreeMap--如果要對元素進行排序,則使用TreeMap對key實現自定義排序,有兩種方式:在TreeMap的建構函式中注入一個Comparator或者使用一個實現了Comparable的key。

(7)如果需要將排序功能加入HashMap,最好是使用Treemap而不是在應用程式自定義排序。

(8)HashMap基於Hash表實現,TreeMap基於紅黑樹實現。

3、Map和Set的關係:

(1)所有Set的實現都只是對應的Map的一種封裝,其內部維護一個Map物件。即:Set只是相應的Map的Value是一種特殊的表現形式的一種特例。

(2)Set主要有三種實現類:HashSet、LinkedHashSet、TreeSet。其中HashSet是基於Hash的快速元素插入,元素之間無序。LinkedHashSet同時維護著元素插入順序,遍歷集合的時候,總是按照先進先出的順序排序。TreeSet是基於紅黑樹的實現,有著高效的基於元素Key的排序演算法。

4、優化集合訪問程式碼:

(1)、分離迴圈中被重複呼叫的程式碼:例如,for迴圈中使用集合的size()函式,則不應該把這個函式的呼叫放到迴圈中,而是放到迴圈外邊、

(2)、省略相同的操作:

5、RandomAccess介面:通過RandomAccess可知道List是否支援隨機快速訪問。同時,如果應用程式需要通過索引下標對List做隨機訪問,儘量buyaoshiyongLinkedList,ArrayList或者Vector可以。

6、JavaNIO的特性:

1、為所有的原始型別提供Buffer支援。

2、使用set作為字元編碼解碼解決方案。

3、增加通道抽象代替原有的IO流抽象。

4、支援鎖和記憶體對映檔案的檔案訪問介面。

5、提供基於Selector的非同步網路IO。

7、Java中NIO的使用。Channel是一個雙向通道,即可讀也可寫。應用程式不能直接操作Channel,必須藉助於Buffer。例如讀資料的時候,必須把資料從通道讀入到緩衝區,然後在緩衝區中進行讀取。以檔案讀取為例,首先通過檔案輸入流獲得檔案通道,然後把檔案通道的內容讀入到緩衝區中,然後就可以對緩衝區操作。

8、Buffer的基本原理:

1、Buffer的建立:Buffer的靜態allocate(int size)方法或者(byte[]src)。

2、Buffer的工作原理:三個變數:position,代表當前緩衝區的位置,寫緩衝區的時候,將從position的下一個位置寫資料。Capacity,代表緩衝區的總容量上限。Limit,緩衝區的實際上限,也就是說,讀資料的時候,資料即是從position到limit之間的資料

3、flip操作:limit=position,position=0,一般是在讀寫切換的時候使用。寫完資料之後,需要限定下有效資料範圍,才能讀資料;

4、clear操作:position-0,limit=capacity.。為重新寫入緩衝區做準備。

5、rewind操作:position=0,為讀取緩衝區中有效資料做準備,一半limit已經被合理設定。

9、讀寫緩衝區:

1、public byte get():順序讀取緩衝區的一個位元組,position會加一

2、public Buffer get(byte[]dst):將緩衝區中的資料讀入到陣列dst中,並適當的移動position

3、public byte get(int index):得到第index個位元組,但不移動posoiion

4、public ByteBuffer put(byte b):將位元組b放入到緩衝區中,並移動position

5、public ByteBuffer put(int index,byte b):將位元組b放到緩衝區的index位位置

6、pubglic final ByteBuffer(byte[]src):將位元組陣列src放到緩衝區中。

10、標誌緩衝區:類似於一個書籤的功能,在資料的處理過程中,可隨時記錄當前位置。然後在任意時刻,回到這個位置。Mark用於記錄當前位置,reset用於恢復到mark所在的位置、

11、複製緩衝區:使用Buffer的duplicate方法可以複製一個緩衝區,副本緩衝區和原緩衝區共享一份空間但是有有著獨立的position、capacity和limit值。

20、緩衝區分片:緩衝區分片使用slice方法實現。它將在現有的緩衝區中,建立的子緩衝區。子緩衝區和父緩衝區共享資料。這個方法有助於將系統模組化。緩衝區切片可以將一個大緩衝區進行分割處理,得到的子緩衝區都具有緩衝的緩衝區模型結構;因此。這個操作有助於系統的模組化。

12、只讀緩衝區:只讀緩衝區可以保證核心資料的安全,如果不希望資料被隨意篡改,返回一個只讀緩衝區是很有幫助的。

13、檔案對映到記憶體:NIO提供了一種將檔案對映到記憶體的方法進行IO操作,這種方法比基於流IO快很多。這個操作主要由()操作。使用檔案記憶體的方式,將文字通過FileChannel對映到記憶體中。然後從記憶體中讀取資料。同時,通過修改Buffer,將對記憶體中資料的修改寫到對應的硬碟檔案中。

14、處理結構化資料:散射和聚集。散射就是將資料讀入到一組bytebuffer中,而聚集正好相反。通過ScatteringByteChannel和GatheringByteChannel可以簡化對結構資料的操作。

15、直接記憶體訪問:DirectBuffer直接分配在實體記憶體中,並不佔用對空間,因此也不受對空間限制。DirectBuffer的讀寫操作比普通Buffer塊,因為DirectBuffer直接操縱的就是核心緩衝區。

16、引用型別:強、軟、若、虛四種引用型別。

WeakHashMap:是弱引用的一中典型應用,它使用弱引用作為內部資料的儲存方案。可以作為簡單的快取表解決方案。如果在系統中,需要一張很大的Map表,Map中的表項作為快取之用。這也意味著即使沒能從該Map中取得相應地資料,系統也可以通過選項方案獲取這些資料,雖然這樣會消耗更多的時間,但是不影響系統的正常執行。這個時候,使用WeakHashMap是最合適的。因為WeakHashMap會在系統記憶體範圍內,儲存所有表項,而一旦記憶體不夠,在GC時,沒有被引用的又會很快被清除掉,避免系統記憶體溢位。

17、有助於改善系統性能的技巧:

1、慎用異常:for迴圈中使用try-catch會大大降低系統性能

2、使用區域性變數:區域性變數的訪問速度遠遠高於類的靜態變數的訪問速度,因為類的變數是存在在堆空間中的。

3、位運算代替乘除法:右移代表除以二、左移代表乘以二。

4、有的時候考慮是否可以使用陣列代替位運算。

5、一維陣列代替二維陣列。

6、提取表示式:儘可能讓程式少做重複的計算,尤其要關注在迴圈體的程式碼,從迴圈提中提取重複的程式碼可以有效的提升系統性能。