拼接String對象的優化

package com.mfs.stringtest;

public class StringTest {
	private static String hello = "hello";
	private static String blank = " ";
	private static String world = "world";
	private static String over = "!";
	public static String addStrings1() {
		return hello + blank + world + over; 
	}
	public static String addStrings2() {
		StringBuilder sb = new StringBuilder();
		sb.append(hello);
		sb.append(blank);
		sb.append(world);
		sb.append(over);
		return sb.toString();
	}
	public static void main(String[] args) {
		System.out.println(addStrings1());
		System.out.println(addStrings2());
	}
}

我們都知道String對象是不可變得,也就是說我們對String對象的任何修改、添加和刪除操作所得到的都是一個全新的string對象。那麼上邊代碼的addStrings1()方法按照常理來說每執行一個“+”(拼接)就會重新返回一個新的String對象(早期的java卻是是這樣)。這樣創建大量的String對象無疑是浪費了大量的資源的。所以後期的java就對此做出了優化。當我們寫了如addStrings1()這樣的程序是,java虛擬機會爲我們的代碼做自動的優化。大體優化成如addStrings2
()這樣的代碼形式。可以看到java的優化程序中自動的創建了StringBuilder對象,然後用此對象在調用append()方法拼接字符串,最後調用toString()方法去返回一個拼接好的String字符串對象。
事實上,在大多數情況下情況下這種java的自動優化是非常有效的,我們可以仍然按照我們的管用習慣去用“+”拼接字符串,讓java虛擬機自動幫我們實現優化,可以說是美滋滋了。
但我們不妨考慮下面StringTest2中addStrings1()中在循環體中拼接字符串的情況,按照java虛擬機自動優化的方法,他會幫我們優化成addStrings2()方法所示的形式。仔細觀察addStrings()的代碼你會發現,每次循環他都會自動創建一個StringBuilder對象,那麼這樣一來跟每次創建一個String對象有什麼區別呢?最終結果都是創建了大量的對象,根本達不到優化的目的。這個時候想要優化String字符串的拼接優化就需要我們顯示的使用StringBuilder對象了,手動優化後的代碼如addStrings3()方法所示。

在這裏插入代碼片package com.mfs.stringtest;

public class StringTest2 {
	private static String[] strs = { "hello", " ", "world", "!" };

	public static String addStrings1() {
		String str = "";
		for(int i = 0; i < strs.length; i ++ ) {
			str += strs[i];
		}
		return str;
	}
	public static String addStrings2() {
		String str = "";
		for(int i = 0; i < strs.length; i ++) {
			StringBuilder sb = new StringBuilder(str);
			sb.append(strs[i]);
			str = sb.toString();
		}
		return str;
	}
	public static String addStrings3() {
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < strs.length; i ++) {
			sb.append(strs[i]);
		}
		return sb.toString();
	}
	public static void main(String[] args) {
		System.out.println(addStrings1());
		System.out.println(addStrings2());
		System.out.println(addStrings3());
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章