參考博文:https://blog.csdn.net/qq_34490018/article/details/82110578
1.String類是使用了final修飾,內置char[] 也是使用了fianl修飾,當你改變String的時候,通常會重新new一個對象,String實例的值是通過字符數組實現字符串存儲的。
2.什麼時候創建呢,一般都是先查找字符串常量池有沒有該對象,有的話直接將常量池對象的內存地址引用過來(也就是沒有新建對象),沒有則創建新的地址,並存到常量池裏.
舉例子:
-
+拼接字符串 編譯期就已經拼接了
String a=“a”+“b”+“c”+“d” ;創建了幾個對象? //0個或者1個對象
右邊是"+“號拼接,而且都是常量不是對象引用,編譯時相當於拼接了"abcd”,
接着纔去運行時常量池查找對象地址是否存在,有的話直接引用地址,沒有就創建一個.
等價: String a=new StringBuilder(“abcd”);
//常量池查找"abcd" -
new對象
String b=new String(“abcd”);
這裏 可以拆分兩步,等價於 String a=“abcd”; String b=new String(a);
那麼,常量池沒有"abcd" 就會創建一個, 之後new一個,一共2個對象;
public class Test {
public static void main(String[] args) {
String a="a"+"b"+"c"+"d";
String b=new String(a);
String c="abcd";
System.out.println(a==b); //false
System.out.println(a==c); //true
}
}
- 混合使用,假設常量池不存在 13,1,14,1314
String a=”1”+”3”+new String(“1”)+”4”;
相當於 String n1=“13”,String n2=“4”; //創建2個對象,13和4
String a=n1+new String(“1”)+n2; //new創建了2個, 裏面的對象是個String
String a=“1314” ; //1314拼接後又創建1個
一共是4個對象 - new+new
String a=new String(“1”)+new String(“1”);
相當於, 創建了對象 String n=“1”; //創建一個"1"
String a=new String(n)+new String(n); //new了兩個對象
//最後拼接了 “11” 創建一個
//一共四個對象
ps:JDK6中的常量池是放在永久代的,永久代和Java堆是兩個完全分開的區域