Java String有多少个字符?

问题

我正在尝试从Sphere Online Judge(SPOJ)获得The Next Palindrome问题,我需要找到一个高达一百万位整数的回文。我想过使用Java的函数来反转字符串,但它们是否允许String这么长?


#1 热门回答(193 赞)

你应该能够获得长度为Integer.MAX_VALUE的字符串(总是2147483647(231-1),Java规范,数组的最大大小,String类用于内部存储)或最大堆大小的一半(因为每个字符都是两个字节),以较小者为准。


#2 热门回答(18 赞)

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


#3 热门回答(11 赞)

虽然理论上可以使用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);
        }
    }
}

在Oracle Java 8更新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亿个字符