字符串是程序中使用頻率最高的一種數據類型,Java為了加強程序的運行速度,因此設計了兩種不同的方法來生成字符串對象。一種是調用String類的構造函數,另一種是使用“”。這兩種方法產生的字符串對象在內存中存放的機制不同: (1)在使用String構造函數定義字符串對象時,Java環(huán)境會和創(chuàng)建其他類型的對象一樣,每次調用,都會創(chuàng)建一個新的對象。 (2)Java為String類型提供了緩沖池機制,當使用雙引號定義對象時,Java環(huán)境首先去緩沖池尋找相同內容的字符串,如果存在就直接拿出來使用,如果不存在則創(chuàng)建一個新的字符串放入緩沖池中。 上面的兩種機制分別對應字符串的存儲形式為堆存儲和常量池存儲。可以看下面的例子: 另外,堆存儲可以轉換為常量池存儲,是通過String類的intern()方法實現(xiàn)的。Intern方法的了解可以看JDK的描述,講解的非常透徹: A pool of strings, initially empty, is maintained privately by the class String. When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. It follows that for any two strings s and t, s.intern()==t.intern() is true if and only if s.equals(t) is true. All literal strings and string-valued constant expressions are interned. 我對上面的英文進行了翻譯,譯文如下: 當調用intern 方法時,如果池中已經包含一個等于此String 對象的字符串(是否相等由 equals(Object)方法確定),則返回池中的字符串引用。否則,將此 String 對象添加到池中,并且返回此String 對象的引用。例如:對于任何兩個字符串s和t,當且僅當s.equals(t)為true時,s.intern()==t.intern()才為true。 所有字面值字符串和字符串賦值常量表達式都是intern實現(xiàn)的。 最后列出下面的例子說明了堆存儲和常亮池存儲的區(qū)別: |
|