開發工具:eclipse-jee-kepler-SR1-win32 eclipse
原始代碼: jvm
public class StringTest { 工具
public static void main(String[] args) {
String s1 = "a"+"b"+"c";
String s2 = new String("a")+new String("b")+new String("c");
String s3 = "a"+"b"+new String("c");
String s4 = new String("a")+"b"+"c";
}
} 開發工具
反編譯工具(jd-gui)查看生成的class文件: 優化
public class StringTest
{
public static void main(String[] args)
{
String s1 = "abc";
String s2 = new String("a") + new String("b") + new String("c");
String s3 = "ab" + new String("c");
String s4 = new String("a") + "b" + "c";
}
} ui
百度了一下。 對象
對於String s = new String("a")生成的對象數是兩個應該沒有問題。一個是堆中生成的"a"對象,一個是字符串常量池中的"a"。至於一個指向字符串"a"的引用對象s的這種說法我以爲應該是錯的,對象的引用是在棧中存放,引用應該不是一個對象;若是這種說法成立,能夠推導出只要使用new關鍵字建立對象,都是建立了2個對象,這明顯不合理! ip
String s = "a" + "b" +"c" 就這種寫法,就我貼出的代碼能夠發現。編譯編譯時進行了優化,最後是String s = "abc"。String s = "a" + "b" +"c"這種寫法最後其實只生成了一個對象,而不是"a","b","c","ab","abc"五個對象.其餘組合狀況也能夠對照着看一下! 開發
至於上述代碼時候會應爲jvm不一樣而致使編譯後的結果不一樣,我還沒能研究到那裏去,若有高手但願能告知一下! 字符串