天天看點

java字元串長度_Java中String字元串的最大長度?

1.Java中的字元串String最大長度,編譯期如果是javac編譯就是65534。如果繞過javac編譯的限制,其最大長度可以達到u2類型變達的最大值65535。

Oracle JDK的編譯工具Javac内部,javac也是java寫的

private void checkStringConstant(DiagnosticPosition pos, Object constValue) {

if (nerrs != 0 || // only complain about a long string once

constValue == null ||

!(constValue instanceof String) ||

((String)constValue).length() < Pool.MAX_STRING_LENGTH)

return;

log.error(pos, "limit.string");

nerrs++;

}

在看看Pool.MAX_STRING_LENGTH

public class Pool {

...

public static final int MAX_STRING_LENGTH = 0xFFFF;

...

}

通過上邊代碼可以看到 MAX_STRING_LENGTH = 0xFFFF 而 0xFFFF 是十進制的 65535。但是上面我們得出的結果是Javac編譯下最大長度是65534,是因為 Javac 源碼中做的限制是((String)constValue).length() < Pool.MAX_STRING_LENGTH) 注意是 < 而不是 <= , 小于65535那自然最多隻能是65534了。

但是U2類型能表達的最大值是65535。上面65535個長度的字元串在javac下報錯了是受到了javac編譯器的限制了。如果你在上面65534長度生成的TestStr.class中手動在添加一個字元串(注意是在javac編譯後的class檔案中添加)是可以得到65535長度的結果。

2.Java中的字元串String最大長度運作期大約4G。

3.Eclise編譯超過65534長度的字元串不報錯,是Eclipse有自己的Java編譯器。JDT優化為了StringBuilder的append。

6: invokespecial #20; //Method java/lang/StringBuilder."":(Ljava/la

ng/String;)V

9: ldc #23; //String QyNDAbAgIGqQIBAQ1

11: invokevirtual #25; //Method java/lang/StringBuilder.append:(Ljava/lang

/String;)Ljava/lang/StringBuilder;

14: invokevirtual #29; //Method java/lang/StringBuilder.toString:()Ljava/l

ang/String;

17: invokevirtual #33; //Method java/lang/String.intern:()Ljava/lang/Strin

g;

20: astore_1

21: getstatic #38; //Field java/lang/System.out:Ljava/io/PrintStream;

24: aload_1

25: invokevirtual #44; //Method java/lang/String.length:()I

28: invokevirtual #48; //Method java/io/PrintStream.println:(I)V

31: return

}

4.Eclise使用自己的編譯器。主要原因是JDT核心具有漸進式編譯的能力,這意味着它會逐漸編譯代碼中的更改(這也是Eclipse不需要編譯按鈕的原因,因為它會在檢測到更改時自動編譯)。但Oracle的JDK不支援增量編譯。