<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            java語言

            Java編程性能優化技巧分享

            時間:2025-06-06 06:04:52 java語言 我要投稿
            • 相關推薦

            Java編程性能優化技巧分享

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

              1、字符串優化處理

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

              (2)subString方法的內存泄漏:

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

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

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

              (6)在無需考慮線程安全情況下盡量使用StringBuilder。

              (7)StringBuffer和StringBuilder初始化的時候都可以設置一個初始值,默認是16B。如果字符串的長度大于16B的時候,則需要進行擴容。擴容策略是將原有的容量大小翻倍,以新的容量申請內存空間,建立char數組,然后將數組中的內容復制到這個新的數組中,使用Arrays.copyOf()函數。因此,如果能預先評估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、使用Java.nio.charset.Charset作為字符編碼解碼解決方案。

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

              4、支持鎖和內存映射文件的文件訪問接口。

              5、提供基于Selector的異步網絡IO。

              7、Java中NIO的使用。Channel是一個雙向通道,即可讀也可寫。應用程序不能直接操作Channel,必須借助于Buffer。例如讀數據的時候,必須把數據從通道讀入到緩沖區,然后在緩沖區中進行讀取。以文件讀取為例,首先通過文件輸入流獲得文件通道,然后把文件通道的內容讀入到緩沖區中,然后就可以對緩沖區操作。

              8、Buffer的基本原理:

              1、Buffer的創建:Buffer的靜態allocate(int size)方法或者Buffer.wrap(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快很多。這個操作主要由FileChanne.map()操作。使用文件內存的方式,將文本通過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、提取表達式:盡可能讓程序少做重復的計算,尤其要關注在循環體的代碼,從循環提中提取重復的代碼可以有效的提升系統性能。

            【Java編程性能優化技巧分享】相關文章:

            Java編程性能優化技巧有哪些08-07

            Java性能優化的技巧05-25

            Java性能優化技巧大全07-12

            Java性能優化的五大技巧03-22

            Java 性能優化的五大技巧08-12

            PHP性能優化的技巧07-18

            PHP性能優化技巧02-22

            PHP性能優化小技巧06-27

            PS性能優化通用技巧05-14

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院