Java基礎|字符串String的實例化過程

下面的分析會以這四行代碼爲例:
String s1 = “abc”;①

String s2 = “abc”;②

String s3 = new String(“abc”);③

String s4 = new String(“bcd”);④
思考:各行代碼中分別創建幾個String對象?答案之後揭曉。

在分析實例化過程前,我們首先要清楚:

  • String類底層在jdk 1.9之前使用 final char[ ] 存放字符串。在jdk 1.9之後使用 final byte[ ] 存放字符串。

  • Java程序中所有字符串字面值(如”abc“)都作爲String類的實例實現,實例化後的字符串對象存放於堆中。字符串常量池會維護其對象的引用,使得字符串對象不會被gc回收,以便之後被複用。字符串常量池在jdk 1.7之前存放與方法區中,jdk1.7之後存放於堆中。

    • 爲什麼要有字符串常量池:字符串也是一個對象,創建它也需要耗費高昂的時間和代價。如果同一內容的字符串對象頻繁創建多次,會極大地影響程序的性能。

現在開始對字符串的實例化過程進行分析:

①首先在棧中創建一個String類型的引用變量s1,接着jvm會去字符串常量池中查看,是否有引用所指向的字符串對象內容爲“abc”,有則直接將其引用賦給s1;沒有則在堆中新創建一個字符串對象,內容爲“abc”,然後將其引用交給字符串常量池去維護,接着把引用賦值給棧中的引用變量s1。
String s1 = "abc";
在這裏插入圖片描述
此步創建了一個String對象


②首先在棧中創建一個String類型的引用變量s2,接着jvm去字符串常量池中查找,發現有引用所指向的字符串對象內容爲“abc”,所以直接將其引用賦給s2。
String s2 = "abc";

在這裏插入圖片描述
現在我們知道了第二步沒有創建String對象,s2和s1共享常量池中所指向的存儲着"abc"的同一字符串對象。


③這步可以拆分爲兩個步驟:String original = “abc”;String s3 = new String(original);jvm會首先去字符串常量池找有沒有引用所指的字符串對象內容爲“abc",發現有,則直接將其引用賦值給original(original是我們所用到的有參構造中的形參,下面的代碼中可以看到);沒有則需要在堆中創建一個字符串對象去存儲“abc”,然後把其引用交給字符串常量池維護。
String s3 = new String("abc");

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    //...
    private final char[] value;//把字符串轉換成字符數組存儲
    //...
	public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    //.,,
}

jdk1.9之前String類底層使用char[]來存儲字符串。因爲數組是引用類型,所以this.value = original.value;這行代碼的意義就是把構造函數中傳入的字符串對象中的value的引用賦值給新創建的字符串對象的value。這說明了什麼,說明了this對象和original所指向的字符串對象共享同一個字符數組。

在這裏插入圖片描述

因爲構造方法中的"abc"的實例對象,已經被字符串常量池管理了,所以此步new只創建了一個新的String對象。


④因爲字符串常量池中所指向的字符串對象沒有一個內容爲"bcd”,所以需要在堆中創建內容爲”bcd“的字符串對象,並且其對象引用會交給字符串常量池去維護。接着new一個新的字符串對象,構造方法中傳入剛剛創建的"bcd"字符串對象的引用,將其內部的char[ ]類型的value賦值給new出來的字符串對象的value。

String s4 = new String("bcd");
在這裏插入圖片描述
此步構造方法中的"bcd"在常量池中沒有引用所指向的字符串對象存儲,所以需要創建一個字符串對象存儲"bcd",並且new關鍵字也創建了一個的String對象。所以此步創建了2個String對象

參考:
Java String:字符串常量池
Java 字符串(一)字符串初始化
Java中String類如何實例化

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