具有字符串长度限制的Java

时间:2013-08-21 15:12:24

标签: java

我正在尝试解决Java中的CodeChef问题,并发现我无法创建长度为>的字符串。一百万个字符(至少使用我的编译器)。我在一个字符串中粘贴了Pi的前一百万个十进制数字(例如String PI =“3.1415926535 ... 151”)并且无法编译。当我取出Pi并将其替换为像“dog”这样的较短字符串时,代码会编译。任何人都可以确认这是否确实是Java的限制?

感谢。

4 个答案:

答案 0 :(得分:12)

  

任何人都可以确认这是否确实是Java的限制?

是。字符串文字 1 的长度限制为65535。它没有在JLS中声明,但它是由类文件的结构暗示的;请参阅JVM Spec 4.4.7并注意字符串长度字段是'u2'...这意味着16位无符号整数。

请注意,String对象最多可包含2 ^ 31 - 1个字符。 String ^ strong> literals ; 2 ^ 16 -1限制;例如嵌入Java程序源代码中的字符串常量。

1 - 此限制实际上取决于String的(修改的)UTF-8表示中的字节数。如果字符串由0x01到0x7f范围内的字符组成,则每个字节代表一个字符。否则,一个字符最多可能需要6个字节。


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

答案 1 :(得分:0)

我认为这个问题与字符串文字无关,而与方法大小有关:http://chrononsystems.com/blog/method-size-limit-in-java。据此,该方法的大小不能超过64k。

答案 2 :(得分:0)

这可能是2 ^ 31-1的值,也可能是堆大小的一半。

答案 3 :(得分:-1)

JLS确实指定String类必须遵循String API。 String API具有方法int length()char[] toCharacterArray(),只有当String中的字符数小于或等于Integer.MAX_VALUE时才能使用2^^31 - 1 = 2147483647。这将占用大约4 GB的内存作为字符数组(每个字符2个字节)。这是语言强加的唯一硬限制。在实践中,我们通常受到记忆的限制。