String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的。
就如本文我们要讨论的问题:Java中的String有没有长度限制?
这个问题要分两个阶段看,分别是 编译期 和 运行期。不同的时期限制不一样。
编译期
我们在编写源代码的时候,经常会使用 String s = "abc" 这种方式去声明字符串。 这种用字面量声明的字符串在class字节码文件中是以CONSTANT_urf8_info格式存储的。
CONSTANT_urf8_info
结构如下:
其中 u2 length 表示这个表中字节数组的最大长度,也就是说 bytes 的最大长度是2的16次方--65536。因此一个字符串最大长度也就是u2所能代表的最大值65536个,但是需要使用2个字节来保存 null 值,因此一个字符串的最大长度为 65536 - 2 = 65534个字节 。
注意:
上述解释中说的是字符串最大长度为65534个字节,并不代表一个字符串中就可以保存65534个字符。因为在utf-8编码下,一个数字和一个英文字母占一个字节,但是一个汉字却可以占用2~4个字节。因此如果使用字面量的方式声明中文字符串的长度会远远小于65534。
运行期
上面提到的这种String长度的限制是编译期的限制,也就是使用String s= "";这种字面量方式定义的时候才会有的限制。
那么。String在运行期有没有限制呢,答案是有的。先看下String.java的源码:
String内部是以char数组的 value 存储的,数组的长度是int类型的 count,那么String允许的最大长度就是Integer.MAX_VALUE(2147483647) 了。java中一个char占2个字节,也就是16位。String的运行时最大占用空间计算公式如下:
因此运行时大概需要约4GB的内存才能存储最大长度的字符串。