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、提取表達式:儘可能讓程序少做重複的計算,尤其要關注在循環體的代碼,從循環提中提取重複的代碼可以有效的提升系統性能。