String創建問題?

參考博文: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堆是兩個完全分開的區域
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章