Copyright©stonee
早知道前1年半就好好学习了QAQ
我们知道String有一个构造方法是这样的:
public String(char value[], int offset, int count) {
this(value, offset, count, rangeCheck(value, offset, count));
}
它的意思就是说一共接收count个字符,那么因为count是int,所以 我们可以初步认为char vlaue[]
中可以保存Integer.MAX_VALUE个字符,即0x7fffffff个char型,换成位的话需要*16。
但是我刚才做了个实验
public class TestString {
public static void main(String[] args) {
// String str = "";
// for (int i = 0; i <65355; i++) {
// str = str + "i";
// }
String a ="ii...ii"; //65535个i
String a ="ii...ii"; //65534个i /ok
System.out.println(a);
}
}
如果是直接初始化65535个字符的时候,就会爆出异常:
错误:(12, 19) java: 常量字符串过长
QAQ 不是说好了0x7ffffffff个吗,为什么才65535个就报错了,原因就出在常量池!
在字符串常量池中,Java中UTF-8的Unicode字符串都是以CONSTANT_Utf8类型表示,而其中的length要求为无符号的16位整数
所以在运行时期:
2^16 = 65536,但是java class文件中是一种变体UTF-8格式,null值需要两个字节,因此只剩下了我们栗子中的65534个字节了,换成位的话,还需要*16.