問題:有一次定義一個超長的字符串,結果編譯的時候就報錯:Error:(59, 20) java: 常量字符串過長
原因:(經過查閱資料才明白)
String內部是bai以char數組的形式存儲,數組的長度是int類型,那么String允許的最大長度就是Integer.MAX_VALUE = 2^zhi31 - 1 = 2147483647。又由於java中的字符是以16位存儲的,因此大概需要4GB的內存才能存儲最大長度的字符串。
不過這僅僅是對字符串變量而言,如果是字符串常量,如“abc”、”1234”之類寫在代碼中的字符串str,那么允許的最大長度取決於字符串在常量池中的存儲大小,也就是字符串在class格式文件中的存儲格式:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
u2是無符號的16位整數,因此理論上允許的string的最大長度是2^16-1=65535。然而實際測試表明,允許的最大長度僅為65534,超過就編譯錯誤。
驗證:
首先構造一個長度為65534的字符串
public static void main(String[] args){ System.out.println("構造的字符串長度" + bigString.length()); } |
運行,在控制台復制出輸出的字符串,賦值給新定義的常量字符串,並且增加一個字節b,使得字符串長度為65535
public static void main(String[] args){ System.out.println("構造的字符串長度" + bigString.length()); // 常量字符串(1個b+ 65534個a = 65535個字符) |
運行上述代碼,報常量字符串過長的錯,說明常量字符串最多為65534個字節