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;
字符串长度1是什么意思 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 = "aaa";
System.out.println(chaochang);
}
运⾏上述代码,报常量字符串过长的错,说明常量字符串最多为65534个字节
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论