1. String 类型字符限制基础
String.length()
方法返回int
类型,因此理论上字符串长度不会超过int
的最大值。
2. 编译时限制
- 编译器源码显示,字符串长度大于等于 65535 时编译不通过。
- Java 字符常量使用 UTF-8 编码,1 到 4 个字节表示 Unicode 字符。
3. 示例
- 示例
s1
: 65534 个字母 ‘d’,编译通过(每个字母 1 字节,共 65534 字节)。 - 示例
s2
: 21845 个中文 ‘自’,编译通过(每个中文 3 字节,共 65535 字节)。 - 示例
s3
: 1 个英文 ‘d’ + 21845 个中文 ‘自’,编译失败(共 65536 字节,超限)。
4. JVM 常量池限制
- 常量池中的 Unicode 字符串以
CONSTANTUtf8
类型存储。 CONSTANTUtf8_info
包含u2 length
字段,表示最大字节数,理论上最大为 65535。
5. 运行时限制
- 运行时
String
的最大长度受int
最大值限制,即 (2^{31} - 1)。 - 实际长度受限于 JVM 内存大小。
6. 内存占用估算
- 最大字符串可能占用 2GB 内存(最坏情况下每个字符 4 字节)。
- 如果 JVM 无法分配足够内存,会报错。
7. JDK 9 优化
- JDK 9 后,
String
底层存储从char
数组改为byte
数组。 - 对于 LATIN1 字符,可以节省一半内存空间。