2016-05-14 120 views
4

因此,當我偶然發現一個令人困惑的構造函數時,我正在閱讀String類。該代碼是這樣String類中的空構造函數

public final class String 
    implements java.io.Serializable, Comparable<String>, CharSequence { 

    /** The value is used for character storage. */ 
    private final char value[]; 

    /** Initializes a newly created {@code String} object so that it represents 
    * an empty character sequence. Note that use of this constructor is 
    * unnecessary since Strings are immutable. 
    */ 
    public String() { 
     this.value = "".value; 
    } 
// the rest of the class code 
} 

我不明白是什麼呢

"".value;

做。這是什麼""?這是一個新的String object?如果是,用什麼構造函數?

+3

這意味着長度爲0的字符串 – emotionlessbananas

+0

這很簡單字符串文字對象駐留在字符串池中..請參閱http://stackoverflow.com/questions/3052442/what-is-the-difference-between-text-and-新的字符串文字 –

+0

你能提供一個鏈接到有問題的代碼嗎?因爲OpenJDK [7](http://hg.openjdk.java。net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/classes/java/lang/String.java#l151)和[8](http://hg.openjdk.java.net/jdk8/jdk8/jdk /file/687fd7c7986d/src/share/classes/java/lang/String.java#l138)有'this.value = new char [0];'。 – dhke

回答

1

這是什麼「」?它是一個新的String對象嗎?

這是一個空字符串。它不一定是新的並且很可能不是,因爲字符串文字是interned

如果是,用什麼構造函數?

在編譯的時候空字符串可能是由源代碼Scannersequence of input characters使用String(char[], int, int)創建。

在運行時,ClassLoader已加載並通過java_lang_String::create_from_unicode()和朋友在本機代碼中從類文件中獲取字符串。

至於爲什麼使用"":這是一個內存使用優化。由於字符串文字是interned,"".value是對每個空字符串的同一底層字符數組的引用。

從倉庫,OpenJDK(78)以前使用this.value = new char[0];。每個出現在源代碼中的new String()都會創建一個新的char數組對象(即絕不會)。

當前OpenJDK 9有"".value

此更改可以防止創建新的char數組,從而每個非實際文件保存幾個字節,但新創建的空字符串。更改後,所有零長度的字符串共享相同的(零長度)char數組。

我認爲這是一個罕見的情況,因爲我不記得我是否曾經在任何地方使用過new String()

+0

我真的不應該在上午3點寫下評論,* mea culpa,*但是仍然沒有任何'* the *'Java編譯器。描述一個實現的功能無法正確回答問題。 – EJP

+0

@EJP當然,你在那裏* *可能*進來的地方,這應該被看作是一個簡短的形式*如果使用標準的JDK編譯器,那麼...... *。但是,答案也可以在沒有面包屑線索的情況下首先從字符串的起始位置開始。 – dhke

0

""String,因此具有char[] values,因爲任何String會。但是,它沒有字符,因此values是一個空數組。

基本上,代碼將values初始化爲一個空數組。