一、String類簡介java.lang.String類用于描述一個字符序列。String類是不可變對象的類。其對象一旦被創建,永遠無法改變。但是對象的引用可以重新賦值。而且String類被final關鍵字修飾,其本身不能被繼承。String類內部封裝了字符數組以及針對字符數組操作的相關算法。二、關于String類是不可變對象的幾點解釋1、經常使用String類作為方法的參數,為了保證方法的調用正確,要求字符串內容不可以改變2、出于內存的考慮,重用在開發中遠比修改多得多。所以Java在重用字符串的時候沒有新建新對象,而是都引用同一個。這就要求字符串內容不可變。出于性能的考慮,JVM會將靜態字符串(字面量/常量/常量連接的結果)在常量池中創建。并盡量使用同一對象重用靜態字符串。對于重復出現的靜態字符串,JVM會首先在常量池中查找,如果存在即返回該對象。不存在則創建。public static void main(String[] args){ /** * 當我們使用字符串字面值創建字符串對象時, * 虛擬機會首先在常量池中查找,如果存在即返回該對象 */ String str1 = "hello";//字符串 類創建對象的時候不需要new String str2 = "hello"; String str3 = "hello"; String str4 = new String("hello"); System.out.PRintln(str1 == str2);//使用==比較字符串的時候比較的是地址,而不是內容。 System.out.println(str1 == str3); System.out.println(str1 == str4);//false System.out.println(str1.equals(str4));//true //使用equals方法比較的是字符串中的內容}
str2,str3不會創建新的對象,而是使用常量池中已有的Hello。str4使用new關鍵字會創建一個新的對象。
三、編譯器對字面值量的優化
編譯器在編譯源文件的時候若發現表達式的兩邊都是常量的話,會先進行計算,在將結果生成到字節碼文件中去。所以jvm運行.class文件的時候。下面的內容應該是這樣的。
String str5 = "123"+"abc";//編譯器先進行運算String str5 = "123abc";String s = "123";//編譯器不運算,因為s是變量String str6 = s + "abc";
四、String類在內存中采用Unicode編碼,每個字符在內存中都占用兩個字節(不管中英文)。而且每個字符的長度都是1(不管中英文)。
public static void main(String[] args) { String str = "好好努力,學好java"; System.out.println(str.length());//11 }
新聞熱點
疑難解答