Java中的字符串长度限制

3
我正在尝试使用Java解决一个CodeChef问题,但发现我无法创建长度大于一百万个字符的字符串(至少是在我的编译器中)。在Java文件中,我将圆周率的前一百万位小数复制到了一个字符串中(例如String PI = "3.1415926535...151"),结果导致编译失败。当我移除Pi并用一个更短的字符串像“dog”来替换它时,代码就可以编译了。请问是否有人能够确认这是否确实是Java的限制?
谢谢。

1
你有编译器产生的错误信息吗? - Colin D
1
@RobertH 这不是那个问题的重复。你可以通过编程创建比字符串字面量限制更大的字符串。 - Colin D
没有精确的错误信息,这可能与此链接相同:https://dev59.com/D3VC5IYBdhLWcg3wnCWA - Katona
2个回答

18
有人能确认Java确实存在这个限制吗?是的。字符串字面量长度存在一个65535的实现限制1,虽然它没有在JLS中声明,但它由类文件的结构所暗示;请参阅JVM规范4.4.7,注意字符串长度字段为'u2'…这意味着16位无符号整数。请注意,一个String对象最多可以有2^31 - 1个字符。2^16 -1的限制实际上是针对字符串值常量表达式的,例如嵌入在Java程序源代码中的字符串字面量或字面量连接。


如果你想要一个表示Pi前一百万个数字的字符串,那么最好从文件系统或类路径上的资源中读取字符。


1-这个限制实际上是对字符串的(修改后)UTF-8表示中字节数的限制。如果字符串由0x01到0x7f范围内的字符组成,那么每个字节代表一个字符。否则,一个字符可能需要多达6个字节。


-1

这可能与方法的大小有关,如果字符串是在方法中声明的... 但问题中没有表明。 如果是这种情况,那么 OP 就会有 2 个问题。 - Colin D
@ColinD:根据这个,对于静态初始化程序也是有效的。 - Katona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接