String類型對象創建個數,我總結爲一下幾種情況(均不考慮字符串在常量池中已存在的情況):
1 String a="123";
創建了1個對象
jvm在編譯階段會判斷常量池中是否有 "123" 這個常量對象如果有,a直接指向這個常量的引用,如果沒有會在常量池裏創建這個常量對象。
2 String a=new String("123");
創建了2個對象
同情況1,jvm編譯階段判斷常量池中 "123"存在與否,進而來判斷是否創建常量對象,然後運行階段通過new關鍵字在java heap創建String對象。
3 String a="123"+"456";
創建了1個對象
jvm編譯階段過編譯器優化後會把字符串常量直接合併成"123456",所有創建對象時最多會在常量池中創建1個對象。
4 String a="123"+new String("456");
創建了4個對象
常量池對象"123" ,"456",new String("456")創建堆對象,還有一個堆對象"123456"。