我试图从球面在线判断(SPOJ)的 下一个回文问题,我需要找到一个回文的整数多达一百万位数。我考虑过用 Java 的函数来反转 String 但是它们允许 String 这么长吗?
我相信它们最多可以达到2 ^ 31-1个字符,因为它们是由一个内部数组保存的,而数组是由 Java 中的整数索引的。
您应该能够得到一个长度字符串
Integer.MAX_VALUE 总是 2,147,483,647(231-1) (由 Java 规范定义,数组的最大大小,String 类用于内部存储) 或
Integer.MAX_VALUE
(因为每个字符是两个字节)。
MAX _ VALUE 是字符串的最大大小 + 取决于你的内存大小,但球体的在线判断问题你不必使用这些函数
你有没有考虑过用 BigDecimal代替 String来保存你的数字?
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个)。