create at 20211016,modify at
常量池中的字符串
String s = "111";
这样定义的字符串会存入常量池,字符串最大体积取决于常量池的规则:
Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。
CONSTANT_Utf8的数据结构如下:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
u2是无符号的16位整数,因此理论上允许的最大字符串体积是2^16-1=65535字节
从jdk源码中可见当字符串体积大于或等于65535字节报错:
private void checkStringConstant(DiagnosticPosition var1, Object var2) {
if (this.nerrs == 0 && var2 != null && var2 instanceof String && ((String)var2).length() >= 65535) {
this.log.error(var1, "limit.string", new Object[0]);
++this.nerrs;
}
}
常量池允许最大的字符串是65534字节
堆中的字符串
String s = "";
for (int i = 0; i < 1_000_000; i++) s += "1";
这样写的字符串是存在堆中的,字符串最大体积取决于堆的规则
String存数据的结构是char数组:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
...
char是占2个字节,所以这个char数组的最大体积=2Integer.MAX_VALUE字节=22147483647/1024/1024/1024=4GB
堆中允许的最大字符串体积是Min(堆大小, 4GB)