1. 程式人生 > >每天學點java效能優化之字串處理優化

每天學點java效能優化之字串處理優化

<pre code_snippet_id="1604271" snippet_file_name="blog_20160310_1_3195965" name="code" class="java">

在java語言中,java的設計者對String物件進行了大量的優化,其主要表現在以下3個方面,“不變性”“針對常量池優化”“類的final定義”。

1.不變性是指String物件一旦生成,則不能再對其進行改變。主要作用在於當一個物件需要被多執行緒程式共享,並且訪問頻繁時,可以省略同步和鎖的等待時間,從而大幅度提高系統性能。不變模式是一個可以提高多執行緒程式的效能,降低多執行緒程式複雜度的設計模式。後面文章會有介紹。

2.針對想城池的優化。當兩個String物件用友相同的值時,它們只引用常量池中的同一個拷貝。當同一個字串反覆出現時,這個技術可以大幅度節省記憶體空間。

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1==str2);//true
System.out.println(str1==str3);//false
System.out.println(str1==str3.intern());//true 該方法中的intern方法,返回程式在常量池中的引用

3.String物件為final類,不可能有任何子類,這對系統安全性考慮。其次是出於提高虛擬機器效率方面考慮,但在jdk1.5以後效率提高並不明顯,不做考慮。  

下面介紹我們在java程式設計中字串常用的優化處理

1.subString()方法的記憶體洩漏 。我們經常使用subString()方法來擷取字串,但這種是以偏移量來擷取字串的方法,利用空間來換取時間效率,但是當字串是一個大字串,而我們擷取的字串很小的時候,會造成記憶體大量浪費。(具體原因可以參考原始碼來理解我說的)所以在用該方法擷取字串的時候,可以利用 new String (str.subString(begin,end))方法重新構造一個字串,這樣之前的字串的強引用消失,gc會進行回收,避免記憶體浪費。

2.字串分割和查詢

2.1 String.split()方法使用簡單,功能強大,但在效能敏感的系統中頻繁使用這個方法不大可取。

2.2 使用效率更高的StringTokenizer類分割字串

StringTokenizer st = new StringTokenizer(orgStr, ";");
while(st.hasMoreElements()) {
System.out.println(st.nextToken());
     }

2.3更優化的字串分割方法

String tmp = orgStr;
while(true){
	String splitStr = null;
	int j = tmp.indexOf(';');
	if(j<0)break;
	splitStr = tmp.substring(0,j);
	tmp=tmp.substring(j+1);
}
tmp = orgStr;

    2.4 charAt()方法和indexOf()效率一樣高,它返回指定位置的字元。應用:例如在判斷字串以什麼開頭和以什麼結尾的時候,利用charAt()方法效率要高於startWith()和endWith()方法,大家可以借鑑使用。
    2.5 在構造長字串累加操作的時候利用StringBuffer和StringBuilder代替String的拼接,避免浪費多於記憶體空間。
例如:String result = "String"+"and"+"String"+"append";首先由"String"和"and" 兩個字串生成"Stringand"物件,然後生成"StringandString"最後生成“StringandStringappend”物件。所以從理論上,這個程式碼效率不高。但是這裡有一點,程式碼編譯的時候這裡進行了優化,此段程式碼編譯結果是String result = "StringandStringappend";java編譯時對靜態字串進行了連線操作,所以實際執行效率很高。但這裡不建議利用編譯器的優化,建議用StringBuffer和StringBuilder進行字串拼接操作,這兩個物件在構建的時候有容量引數這一影響效能的引數不容忽視,在補指定容量引數的時候,預設是16個字元。在追加字串的時候,如果超過實際char陣列的長度會進行擴容,(擴容測試時將原有的容量大小翻倍),如果能夠預先評估大小可有效減少此步驟的操作,提高系統性能。