一个 Java 字符串可以有多少个字符?

我试图从球面在线判断(SPOJ)的 下一个回文问题,我需要找到一个回文的整数多达一百万位数。我考虑过用 Java 的函数来反转 String 但是它们允许 String 这么长吗?

329722 次浏览

我相信它们最多可以达到2 ^ 31-1个字符,因为它们是由一个内部数组保存的,而数组是由 Java 中的整数索引的。

您应该能够得到一个长度字符串

  1. Integer.MAX_VALUE 总是 2,147,483,647(231-1)
    (由 Java 规范定义,数组的最大大小,String 类用于内部存储)

  2. (因为每个字符是两个字节)。

MAX _ VALUE 是字符串的最大大小 + 取决于你的内存大小,但球体的在线判断问题你不必使用这些函数

你有没有考虑过用 BigDecimal代替 String来保存你的数字?

我的朋友们,堆的部分变得更糟了。UTF-16不一定限制在16位,它可以扩展到32位

虽然理论上可以使用 Integer.MAX _ VALUE 字符,但 JVM 可以使用的数组的大小是有限的。

public static void main(String... args) {
for (int i = 0; i < 4; i++) {
int len = Integer.MAX_VALUE - i;
try {
char[] ch = new char[len];
System.out.println("len: " + len + " OK");
} catch (Error e) {
System.out.println("len: " + len + " " + e);
}
}
}

在 OracleJava8更新92打印

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK

注意: 在 Java9中,String 将使用 byte [] ,这意味着多字节字符将使用多个字节并进一步减少最大值。如果你有全部四个字节的代码点,例如表情符号,你只会得到大约5亿个字符

Java9使用 byte []来存储 String.value,因此在 Java9中只能得到大约1GB 的 String。另一方面,Java8可以有2GB 的字符串。

我说的字符是指“ char”,有些字符在 BMP 中不能表示(比如某些表情符号) ,所以它需要更多的字符(目前是2个)。