String:java:常量字符串過長


 問題:有一次定義一個超長的字符串,結果編譯的時候就報錯: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){
  // 構建一個長度為65534的字符串
  String bigString = "";
  int i = 0;
  boolean flag = true;
  while (flag) {
    i++;
    bigString += "a";
    if (i == 65534) {
      flag = false;
    }
  }

  System.out.println("構造的字符串長度" + bigString.length());
  System.out.println(bigString);

}

  運行,在控制台復制出輸出的字符串,賦值給新定義的常量字符串,並且增加一個字節b,使得字符串長度為65535

public static void main(String[] args){
  // 構建一個長度為65534的字符串
  String bigString = "";
  int i = 0;
  boolean flag = true;
  while (flag) {
    i++;
    bigString += "a";
    if (i == 65534) {
      flag = false;
    }
  }

  System.out.println("構造的字符串長度" + bigString.length());
  System.out.println(bigString);

  // 常量字符串(1個b+ 65534個a = 65535個字符)
  String chaochang = "baaa...aaa";
  System.out.println(chaochang);
}

  運行上述代碼,報常量字符串過長的錯,說明常量字符串最多為65534個字節

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM