我正在尝试来自Sphere Online Judge(SPOJ)的The Next Palindrome问题,我需要找到一个高达一百万位整数的回文。我想过使用Java的函数来反转字符串,但它们是否允许String这么长?
答案 0 :(得分:222)
您应该能够获得长度为
的字符串 Integer.MAX_VALUE
始终 2,147,483,647 (2 31 - 1)
(由Java规范定义,数组的最大大小,String类用于内部存储)
或
Half your maximum heap size
(因为每个字符都是两个字节)以较小者为准。
答案 1 :(得分:19)
我相信它们最多可以是2 ^ 31-1个字符,因为它们由内部数组保存,并且数组在Java中由整数索引。
答案 2 :(得分:12)
虽然理论上可以使用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);
}
}
}
on Oracle Java 8 update 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
注意:在Java 9中,字符串将使用byte [],这意味着多字节字符将使用多个字节并进一步降低最大值。如果你有所有四个字节的代码点,例如表情符号,你只会得到大约5亿个字符
答案 3 :(得分:5)
您是否考虑过使用BigDecimal
代替String
来保存您的号码?
答案 4 :(得分:4)
Integer.MAX_VALUE是字符串的最大大小+取决于你的内存大小但是球体上的问题在线判断你不必使用这些函数
答案 5 :(得分:2)
Java9使用byte []来存储String.value,因此在Java9中只能获得大约1GB的字符串。另一方面,Java8可以有2GB字符串。
我的意思是&#34; char&#34; s,某些角色在BMP中无法表现(就像一些表情符号),所以它需要更多(目前为2个)字符。
答案 6 :(得分:0)
我的朋友,堆部分变得更糟。 UTF-16不保证限制为16位,可以扩展到32