Java String有多少个字符?

and*_*and 152 java string

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

Bil*_*ard 230

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

  • ...或者您的最大堆大小除以2 ...因为字符是2个字节 (41认同)
  • Integer.MAX_VALUE是_always_2147483647(2 ^ 31 - 1),这是Java规范的一部分. (6认同)
  • 假设有64位JVM,因为您需要8GB的虚拟内存来存储该长度的字符串. (4认同)
  • @ ChssPly76:是的,这是对的.我编辑了我的答案,谢谢. (2认同)
  • 如何找出最大堆大小?另外,我不知道判断使用哪个java虚拟机来测试我的问题是Integer.MAX_VALUE部分规范的JVM依赖? (2认同)
  • Java 9将仅对每个具有iso-latin-1内容的字符串使用每个字符一个字节,因此,此类字符串可以具有与堆中相同的字符(以字节为单位)(或最大数组长度,以较小者为准),但是在另一个字符串另一方面,由于非拉丁字符串在数组中使用两个字节,因此在Java 9中,它们的最大字符串长度将减半,仅支持1073741823个字符。 (2认同)

ape*_*ins 20

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


Pet*_*rey 14

虽然理论上可以使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

注意:在Java 9中,字符串将使用byte [],这意味着多字节字符将使用多个字节并进一步降低最大值.如果你有所有四个字节的代码点,例如emojis,你将只获得大约5亿个字符

  • Java 9中的[Compact Strings](http://openjdk.java.net/jeps/254)使用Latin-1或UTF-16编码.没有可变长度编码,即没有三字节字符. (2认同)

Tho*_*sen 5

您是否考虑过使用BigDecimal而不是String保留您的号码?